mysql数据库核对_三种优化MySQL数据库查询的方法简介

任何一位数据库程序员都会有这样的体会:高通信量的数据库驱动程序中,一条糟糕的SQL查询语句可对整个应用程序的运行产生严重的影响,其不仅消耗掉更多的数据库时间,且它将对其他应用组件产生影响。

如同其它学科,优化查询性能很大程度上决定于开发者的直觉。幸运的是,像MySQL这样的数据库自带有一些协助工具。本文简要讨论诸多工具之三种:使用索引,使用EXPLAIN分析查询以及调整MySQL的内部配置。

一、使用索引

MySQL允许对数据库表进行索引,以此能迅速查找记录,而无需一开始就扫描整个表,由此显著地加快查询速度。每个表最多可以做到16个索引,此外MySQL还支持多列索引及全文检索。

给表添加一个索引非常简单,只需调用一个CREATE INDEX命令并为索引指定它的域即可。列表A给出了一个例子:

mysql> CREATE INDEX idx_username ON users(username);

Query OK, 1 row affected (0.15 sec)

Records: 1 Duplicates: 0 Warnings: 0

列表 A

这里,对users表的username域做索引,以确保在WHERE或者HAVING子句中引用这一域的SELECT查询语句运行速度比没有添加索引时要快。通过SHOW INDEX命令可以查看索引已被创建(列表B)。

1447590.png 

列表 B

值得注意的是:索引就像一把双刃剑。对表的每一域做索引通常没有必要,且很可能导致运行速度减慢,因为向表中插入或修改数据时,MySQL不得不每次都为这些额外的工作重新建立索引。另一方面,避免对表的每一域做索引同样不是一个非常好的主意,因为在提高插入记录的速度时,导致查询操作的速度减慢。这就需要找到一个平衡点,比如在设计索引系统时,考虑表的主要功能(数据修复及编辑)不失为一种明智的选择。

二、优化查询性能

在分析查询性能时,考虑EXPLAIN关键字同样很管用。EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。下面的一个简单例子可以说明(列表C)这一过程:

1447591.png 

列表 C

这里查询是基于两个表连接。EXPLAIN关键字描述了MySQL是如何处理连接这两个表。必须清楚的是,当前设计要求MySQL处理的是country表中的一条记录以及city表中的整个4019条记录。这就意味着,还可使用其他的优化技巧改进其查询方法。例如,给city表添加如下索引(列表D):

mysql> CREATE INDEX idx_ccode ON city(countrycode);

Query OK, 4079 rows affected (0.15 sec)

Records: 4079 Duplicates: 0 Warnings: 0

列表 D

现在,当我们重新使用EXPLAIN关键字进行查询时,我们可以看到一个显著的改进(列表E):1447592.png 

列表 E

在这个例子中,MySQL现在只需要扫描city表中的333条记录就可产生一个结果集,其扫描记录数几乎减少了90%!自然,数据库资源的查询速度更快,效率更高。

三、调整内部变量

MySQL是如此的开放,所以可轻松地进一步调整其缺省设置以获得更优的性能及稳定性。需要优化的一些关键变量如下:

改变索引缓冲区长度(key_buffer)

一般,该变量控制缓冲区的长度在处理索引表(读/写操作)时使用。MySQL使用手册指出该变量可以不断增加以确保索引表的最佳性能,并推荐使用与系统内存25%的大小作为该变量的值。这是MySQL十分重要的配置变量之一,如果你对优化和提高系统性能有兴趣,可以从改变key_buffer_size变量的值开始。

改变表长(read_buffer_size)

当一个查询不断地扫描某一个表,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果你认为连续扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。

设定打开表的数目的最大值(table_cache)

该变量控制MySQL在任何时候打开表的最大数目,由此能控制服务器响应输入请求的能力。它跟max_connections变量密切相关,增加table_cache值可使MySQL打开更多的表,就如增加max_connections值可增加连接数一样。当收到大量不同数据库及表的请求时,可以考虑改变这一值的大小。

对缓长查询设定一个时间限制(long_query_time)

MySQL带有“慢查询日志”,它会自动地记录所有的在一个特定的时间范围内尚未结束的查询。这个日志对于跟踪那些低效率或者行为不端的查询以及寻找优化对象都非常有用。long_query_time变量控制这一最大时间限定,以秒为单位。

以上讨论并给出用于分析和优化SQL查询的三种工具的使用方法,以此提高你的应用程序性能。使用它们快乐地优化吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
客户关系管理系统 数据库设计报告 "文件状态: "文件标识:"Company-Project-SD-DATABASE " "[ ] 草稿 " " " "[ ] 正式发布 " " " "[ ] 正在修改 " " " " "当前版本:"X.Y " " "作 者:" " " "完成日期:"Year-Month-Day " 版 本 历 史 "版本/状态 "作者 "参与者 "起止日期 "备注 " " " " " " " " " " " " " " " " " " " 目 录 0. 文档介绍 4 0.1 文档目的 4 0.2 文档范围 4 0.3 读者对象 4 0.4 参考文献 4 0.5 术语与缩写解释 4 1. 数据库环境说明 5 2. 数据库的命名规则 5 3. 逻辑设计 5 4. 物理设计 5 4.0 表汇总 5 4.1 表A 6 4.n 表N 6 5. 安全性设计 6 5.1 防止用户直接操作数据库方法 6 5.2 用户帐号密码的加密方法 6 5.3 角色与权限 7 6. 优化 7 7. 数据库管理与维护说明 7 0. 文档介绍 0.1 文档目的 为明确软件需求,统一各位成员的数据操作接口,特编写这个数据库详细设计说明书 ,本文档供本组开发人员参考 0.2 文档范围 0.3 读者对象 本项目所有开发人员 0.4 参考文献 提示:列出本文档的所有参考文献(可以是非正式出版物),格式如下: [标识符] 作者,文献名称,出版单位(或归属单位),日期 例如: [AAA] 作者,《立项建议书》,机构名称,日期 [SPP-PROC-SD] SEPG,系统设计规范,机构名称,日期 0.5 术语与缩写解释 "缩写、术语 "解 释 " "SPP "精简并行过程,Simplified Parallel Process " "SD "系统设计,System Design " " " " " " " "… " " 1. 数据库环境说明 提示: (1)说明所采用的数据库系统,设计工具,编程工具等 (2)详细配置 2. 数据库的命名规则 提示: (1)完整并且清楚的说明本数据库的命名规则。 (2)如果本数据库的命名规则与机构的标准不完全一致的话,请作出解释。 3. 逻辑设计 提示:数据库设计人员根据需求文档,创建与数据库相关的那部分实体关系图(ERD)。 如果采用面向对象方法(OOAD),这里实体相当于类(class)。 4. 物理设计 提示: (1)主要是设计表结构。一般地,实体对应于表,实体的属性对应于表的列,实体之间 的关系成为表的约束。逻辑设计中的实体大部分可以转换成物理设计中的表,但是它们 并不一定是一一对应的。 (2)对表结构进行规范化处理(第三范式)。 4.0 表汇总 "表名 "功能说明 " "bas_dict(字典表) "保存条目,地区,服务类型 " "cst_activity(交往记"保存客户和企业的交往信息 " "录表) " " "cst_customer(客户信"保存客户的详细信息 " "息表) " " "cst_linkman(客户联 "保存客户的联系人记录 " "系人表) " " "cst_lost(客户流失表"保存客户流失的原因 " ") " " "cst_service(服务表 "保存企业为客户的服务记录 " ") " " "sal_chance(机会表)"保存企业和公司建立关系的机会 " "sal_plan(计划表) "保存企业为开发客户所做的计划 " "sys_right( 权限表)"保存本系统的所有权限模块 " "sys_role(角色表) "保存本系统中所有的角色 " "sys_role_right(角色"保存角色表和模块表的主键 " "表和模块表的关联表)" " "sys_user(用户表) "保存用户的信息 " "orders(订单表) "保存客户的订单信息 " "orders_line(订单明 "保存订单明细 " "细表) " " "Product(商品表) "保存商品的信息 " "Storage(仓库表) "保存仓库信息 " 4.1 bas_dict(字典表) "bas_dict "(字典表) " "字段名 "字段描述 "数据类型(精"空/非 "默认值"约束条 " " " "度) "空 " "件 " "dict_type "类别 "nvarchar(50"false " " " " " ") " " " " "dict_item "条目 "nvarchar(50"false " " " " " ") " " " " "dict_value "值 "nvarchar(50"false " " " " " ") " " " " "dict_is_edit"是否可编辑 "bit "false " " " "able

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值