Mysql索引失效的几种情况分析

Mysql索引失效的几种情况分析

1. 首先我们使用Mysql中explain的功能对每条数据库引擎执行SQL时过程进行分析

在这里插入图片描述
explain的用法就是在我们所需要执行的sql前面加上explain这个单词 ,既 explain +SQL;
例如:
explain select * from user where 1=1;

本次我们对explain的分析结果只要分析的是 possible_keys和key,possible_key 是表示该sql语句执行时可能会使用到索引,而key是表示sql实际执行中所用到的索引。

2. 索引失效分析

我在我是用的表中,创建 了三个索引,一个是id、一个是create_time、还有一个是联合索引(id,name)。

2.1 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

为了证明使用or时,索引会失效的,因此我们使用了create_time和id这俩个具有索引的字段进行查询,发现结果如下:
Mysql索引失效的几种情况分析_第1张图片从执行的结果中,我们能够看到执行该sql语句时,引擎可能会使用到的索引有四个,分别是 primary、index_id、index_id_name、create_time这四个,而我们在key中能够发现,其实在最后正在执行时是没有用到了上面的索引的;因此得出结论:使用 or时会使索引失效。

Mysql索引失效的几种情况分析_第2张图片为了证明上面的结论正确,因此我们再一次做实验,发现结果与我们的结论一样。

2.2 使用like也会使索引失效

Mysql索引失效的几种情况分析_第3张图片
Mysql索引失效的几种情况分析_第4张图片为了 证明like会使索引失效,我们使用了 两个具有索引字段的进行测试,发现explain结果中的key字段都是为null,说明使用like时会使索引失效。

2.3 where语句中使用了IS NULL或者IS NOT NULL,会造成索引失效

Mysql索引失效的几种情况分析_第5张图片测试结果如上 ,发现id字段的索引失效。

2.4 索引的最左查询原则导致索引失效

当我们创建联合索引时,例如(id,name)这种联合索引,如果我们使用了name作为查询的条件,而会导致我们所建立的联合索引失效,因为在联合索引的数据结构中,非子叶节点的索引树中,只有第一个索引的字段会在索引中,既索引的b+tree中所有的非子叶节点都是id,而不包含name字段的,而name这个字段的索引是在子叶节点中具有一定顺序的排序 。

Mysql索引失效的几种情况分析_第6张图片我们发现测试结果与我们上面所说的一样,但使用联合索引时。索引会因为最左查询的原则而导致索引失效

2.5 查询条件上包括函数

Mysql索引失效的几种情况分析_第7张图片但我们使用一些mysql中的函数是,也会导致索引失效。

3 总结

1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
2.使用like也会使索引失效
3.where语句中使用了IS NULL或者IS NOT NULL,会造成索引失效
4. 索引的最左查询原则导致索引失效
5.查询条件上包括函数

你可能感兴趣的:(mysql,mysql,索引,数据库,sql)