mysql索引命中查看_MySQL索引无法命中的几种情况及索引验证方法

几种常见的索引不命中情况如果条件中有 or ,即使其中有条件带索引也不会命中(这也是为什么尽量少用or的原因)

like查询是以%开头,如果是int型索引不会命中,字符型的命中 'test%' 百分号只有在右边才可以命中

如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

没有查询条件,或者查询条件没有建立索引

查询条件中,在索引列上使用函数( + , - , * , / ), 这种情况下需建立函数索引

采用 not in, not exist

B-tree 索引 is null 不会走, is not null 会走

联合索引遵循最左原则,不满足的不会命中

验证索引命中情况

索引验证字段:EXPLAIN

示例:EXPLAIN select * from adminlog

执行结果:

d8bc33b83a07f3aaa4ff1975d2ff9850.png

执行结果说明:

一、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子句时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值