Mysql SQL优化
MySQL中有优化器模块Query Optimizer,主要功能是将客户端的SQL,结合数据库系统收集的统计信息,优化SQL进行优化,Query Optimizer基于Query Tree优化SQL,Query Tree通过优化实现DBXP经典数据结构和Tree构造器生成一个指导SQL请求处理的所有步骤。
SQL优化的思路为:
1、找出需要优化的合适SQL
执行次数多而且效率还可以的SQL比执行次数少而且效率低的SQL,更需要优化。
2、定位SQL优化的性能瓶颈
有点SQL使用CPU太多,有的SQL使用IO太多,需要找出性能瓶颈,可以使用Mysql提供的PROILING工具分析性能瓶颈
3、使用Explain和Proile工具对SQL进行分析
查询数据时尽量使用索引。
SQL优化方法:
一、Explain分析SQL执行计划
Explain [extended] select …
extended关键字是Explain语句产生附加信息。
Explain返回属性
select_type:代表查询类型
SIMPLE:表示简单查询,不包括关联查询和子查询
PRIMARY:表示主查询或最外层的查询
UNION,UNION RESULT:表示连接查询中的第二个查询或后面查询语句
DEPENDENT SUBQUERY:表示子查询中第一个查询
DERIVED:表示用于from子句里有子查询,子查询将结果放在临时表里
type:表的连接方式
system:只有一行数据的系统表
const:数据表最多只匹配一行,在查询开始时被读取出来作为常量看待。
possible_keys:指出Mysql能使用哪个索引查询数据。
rows:显示Mysql在表中进行查询时必须检查的行数。
extra:列显示Mysql在处理查询时的详细信息。
using index:说明使用索引访问数据。
using where:是在存储引擎收到行数据后进行过滤。
using temporary:代表Mysql对结果集进行排序时使用了临时表。
using filesort:说明Mysq使用外部索引对数据排序。
当查询计划的Extra扩展信息出现using temporary,using filesort时,说明SQL需要优化。
优化SQL具体方法:
一、SQL拼写中尽量使用替位符,不要直接使用字符值拼写SQL
JDBC编程需要使用PrepareStatement,不使用Statement.
Mybatis中拼写SQL尽量使用#,不使用$
二、SQL的Where子句查询条件,尽量使用索引过滤,并且建立索引字段的顺序需要与Where条件中查询列顺序相同.
三、Where子句中使用or关联条件,需要将关联列都创建索引
四、Where子句中使用like模糊查询,%统配符需要在后面,否则不走索引,例如:name like ‘Java%’
五、尽量少使用in关键字,除非in语句中的值是常量而非子查询。
六、尽量少使用子查询,尤其from子句中的子查询产生临时表。使用关联查询代替子查询。
七、尽量使用union all合并两个结果集,避免使用or连接符。
八、需要执行order by排序,尽量在排序列上创建索引。
九、分组查询通常自动排序,可以通过order by null避免分组排序。
还没有评论,来说两句吧...