MySQL索引无法命中的几种情况及索引验证方法


几种常见的索引不命中情况

  1. 如果条件中有 or ,即使其中有条件带索引也不会命中(这也是为什么尽量少用or的原因)
  2. like查询是以%开头,如果是int型索引不会命中,字符型的命中 'test%' 百分号只有在右边才可以命中
  3. 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
  4. 没有查询条件,或者查询条件没有建立索引
  5. 查询条件中,在索引列上使用函数( + , - , * , / ), 这种情况下需建立函数索引
  6. 采用 not in, not exist
  7. B-tree 索引 is null 不会走, is not null 会走
  8. 联合索引遵循最左原则,不满足的不会命中

验证索引命中情况

索引验证字段:EXPLAIN
示例:

EXPLAIN select * from adminlog

执行结果:

执行结果说明:

一、select_type : 查询类型,常见的值
[SIMPLE:简单表,不使用表连接或子查询。
PRIMARY : 主查询,外层的查询。
UNION 第二个或者后面的查询语句。
SUBQUERY : 子查询中的第一个select]

二、table :输出结果的表
三、type : 表示MySql在表中找到所需行的方式,或者叫访问类型。

常见的类型:
 ALL 、 index 、 range 、    ref 、 eq_ref 、 const,system 、 NULL
从左到右,性能由最差到最好。
3.1 type=ALL 全表扫描
3.2 type=index 索引全扫描,遍历整个索引来查询匹配的行
3.3 type=range 索引范围扫描,常见于 <,<=,>,>=,between,in等操作符
3.4 type=ref 使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的记录行。ref还经常出现在JOIN操作中
3.5 type=eq_ref 类似于ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中有一条记录匹配;简单来说,说是多表连接中使用 主建或唯一健作为关联条件
3.6 type=const/system 单表中最多有一个匹配行。主要用于比较primary key [主键索引]或者unique[唯一]索引,因为数据都是唯一的,所以性能最优。条件使用=。 
3.7 type=NULL 不用访问表或者索引,直接就能够得到结果

四、possible_keys : 可能使用的索引列表
五、key : 实现执行使用索引列表
六、key_len : 索引的长度
七、ref : 显示使用哪个列或常数与key一起从表中选择行。
八、row : 执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引
九、Extra: 该列包含MySQL解决查询的详细信息

9.1 Not exists
9.2 range checked for each record  没有找到合适的索引
9.3 using index 只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的信息。就是建议取索引列。这样就可以不要通过索引去实际表中找数据了。直接返回索引列的数据。一次查询。否则就是索引表查一次,实际表中查一次。
9.4 using temporary 为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。

本文发表于2018年12月04日 19:31
阅读 3167 讨论 0 喜欢 4

讨论

周娱

君子和而不同
按照自己的方式,去度过人生

7803 2937308
抢先体验

扫码体验
趣味小程序
文字表情生成器

加入组织

扫码添加周娱微信
备注“加入组织”
邀请进开发群

闪念胶囊

这个世界上,别人只会看你现在的样子而不是以后的样子。你以后的样子只有自己才相信。如果没有执行力,一切都是虚妄。

对普通人来说,人和人相处其实最重要的是感觉。感觉不好,你说什么都没用,怎么解释都没用,越说越错,反正最后不好的锅都往你身上扣。所谓“说你行你就行,不行也行。说你不行,你就不行,行也不行”就是这个意思。狼要吃人根本不需要理由,你也同样叫不醒装睡的人。遇到这种情况,早点闪人才是上策。不过大部分人的问题是没有闪人的心态,能力,和资源。

考985不牛逼,考上才牛逼。创业不牛逼,创业成功才牛逼。这个社会上很多人把目标当成牛逼的资本,牛逼哄哄的,死活不听劝,然后做的一塌糊涂,给别人添麻烦,让别人帮他料理后事,对此只能呵呵。

当你尝到用生气解决问题的甜头后,你就懒得再用其他方式了。你却忽略了,生气是鸩毒啊,剂量用够了,你的关系也玩完了。

年轻的时候你只搞事业不谈恋爱,等你事业有成了,钱相对自由了,你可能已经没有荷尔蒙了。

如果你经常雇佣比你矮小的人,将来我们就会变成矮人国,变成一家侏儒公司。相反,如果你每次都雇用比你高大的人,日后我们必能成为一家巨人公司。

如果一个人有充裕的时间去完成一项工作,那么他就会放慢节奏或者增加其他不必要的工作,直到花光所有的时间。

天空不是人类休息的地方,人类应该去亲近海洋。

一个人的正直程度,取决于他肯为原则付出的牺牲。

Copyright ? 2016 - 2018 Cion.
All Rights Reserved.
备案:鲁ICP备16007319号.