使用EXPLAIN关键字可以模拟优化器执行SQL查询语句
,从而知道MySQL是如何处理SQL语句的
1.type字段:
结果值从最好到最坏依次是:
system > const > eq_ref > ref
> fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
SQL 性能优化的目标:至少要达到 range级别,要求是ref级别,最好是 consts级别
ALL:全表扫描,没有用到索引
inex:覆盖索引:一个索引中包含了要的数据
range:范围扫描索引,一般就是where语句中出现了between、<、>、in等的查询
ref:普通二级索引与常量等值匹配
eq_ref:连接查询时,主键或非空唯一二级索引等值匹配
consts:通过主键或唯一二级索引列与常量等值匹配
2.possible_keys 和 keys
possible_keys表示可能用到的索引
keys表示实际用到的索引,如果为null,就是没有使用索引
3.key_len
表示索引使用的字节数,根据这个值可以判断索引的使用情况
计算:
1.先看索引字段的类型,比如:int=4 ; varchar(20) =20 ; char(20) =20
2.如果是varchar或者是char,视字符集乘以3或者4,utf8乘以3,utf8mb4乘以4,GBK乘以2
3.varchar这种动态字符串要再加2个字节
4.允许为空的字段再加1个字节
4.rows
执行查询时检查行数
5.filtered
命中率(查询结果占检查行数的百分比)
6.exta
:额外信息
Impossible WHERE:where子句的值总是false
Using where:使用了where:但在where上有字段没有创建索引
Using temporary:使用了临时表保存中间结果
Using filesort:(手工排序)排序操作没用到索引
Using index:使用了覆盖索引:表示直接访问索引就足够获取到所需要的数据:不需要通过索引回表
Using index condition:使用索引下推优化
索引下推优化:比如有两个查询条件,查询到第一条二级索引记录,不着急回表,先判断一下另一个条件是否满足,如果不满足,就放弃该条二级索引记录
Using join buffer:在连接查询时,当被驱动表
不能有效的利用索引时,MySQL会提前申请一块内存空间(join buffer)来加快查询速度