MySQL数据库使用EXPLAIN进行查询优化

优化范围的确定

在项目SQL进行优化前首先需要确定优化范围。对于稍复杂的项目来说逐个SQL进行评估就已经很不现实了。所以我们要从两方面去确定范围

1、SQL使用频率,对于经常使用的进行优化。

2、SQL执行性能,对于执行性能低下的进行优化。

我们可以通过圈定常用功能的方式来圈定使用频率高的SQL范围。而执行性能较低的SQL我们可以通过慢SQL日志及压力测试发现他们。

 

SQL解释(EXPLAIN)

我们可以通过EXPLAIN对SQL进行解释,从而得到当前SQL的执行效率分析数据。

EXPLAIN(SELECT * FROM ex_user)

执行完解释会给出类似下图的结果

113606_4wRO_3452433.png

返回结果各字段主要含义见下表

idMySQL Query Optimizer 选定的执行计划中查询的序列号。表示查询中执行 select 子句或操作表的顺序,id 值越大优先级越高,越先被执行。id 相同,执行顺序由上至下。
select_type查询类型,表示本条解释后的查询属于那种类型。
table本条解释所引用的表。如果表起了别名则显示别名
type

本条解释链接所使用的类型。类型决定了检索范围,检索范围越小效率也就越高。

按照查询效率由高到低的顺序为system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL

possible_keys本条解释可以使用的索引。
key本条解释实际使用的索引。
key_len使用的索引的长度。在不损失精确性的情况 下,长度越短越好。
ref显示索引的哪一列被使用了
rowsMYSQL 认为必须检查的用来返回请求数据的行数。需要检查的行数越多执行效率将会越差。
extra说明信息。如果出现出Using filesort或 Using temporary项意味着 MYSQL 根本不能使用索引,效率会受到重大影响。应尽可能对此进行优化。

下面我们来讨论一下什么样的结果需要进行优化以及优化方案

type值是index 或 all 

这两种类型说明查询是全表扫描查询效率极低,可以通过建立索引减少扫描行数。

rows行数特别多rows查询的行数越多效率越低,可以通过增加检索条件减少行数
extra出现Using filesort或Using temporary这两个提示代表排序或分组是不能使用内部索引,外部索引的效率低下。所以需要建立索引解决此问题。
  
  

创建索引的时候我们要注意以下几点

  • 联合索引中如果出现范围查询的索引要放在最后面。联合索引是按照排序注意匹配的,如果出现相同的值则匹配第二个,但是范围查询会让后面的索引无效所以一定要放在最后。例如三个查询字段a,b,c创建联合索引,查询条件分别为a=1 and b in (1,2,3) group by c,那么这时extra是会出现Using filesort提示的,原因就在于b属于范围条件,导致联合索引的c缩阴无法被分组使用。联合索引改成a,c,b此问题就可以解决了。
  • inner join 和 left join 左表行数确定需要在右表建立索引。而 right join 右表行数确定需要在左表建立索引。

 

关于EXPLAIN详细参数可以参考博文 http://www.cnblogs.com/xiaoboluo768/p/5400990.html

转载于:https://my.oschina.net/u/3452433/blog/1536831

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值