MySql学习笔记(九):索引失效

数据准备:mysql

CREATE TABLE `t_blog` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(50) default NULL,
  `typeId` int(11) default NULL,
  `a` int(11) default '0',
  PRIMARY KEY  (`id`),
  KEY `index_1` USING BTREE (`title`,`typeId`,`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

一、复合索引丢失第一列字段:
image.pngsql

二、复合索引,跳过中间字段:ide

先来看查询条件只有第一列时的结果:
函数

image.png

接下来执行跳过中间字段的状况:性能

image.png

此时索引确实生效,但key_len依旧是153,理论上查询精度越大key_len会越大,但此时并无增大就表示条件【a='123'】上的索引并无用到。spa

复合索引应当遵照【最左前列原则】,即:查询应该从索引的最左前列开始而且不能跳过中间列,一旦跳过某个列,该列以后的列上的索引都会失效blog

三、在索引上进行计算、函数、类型转换等操做致使索引失效:
使用函数:
索引

image.png

进行自动类型转换,title定义的是varchar类型,但查询时给他赋值int致使mysql会自动给他进行类型转换致使索引失效rem

image.png

使用  + - * / 等计算it

image.png

四、使用了范围致使该索引以后的索引失效

先来看一下没使用范围的sql执行状况:

image.png

随着查询精度的增大,key_len增大,表示两个条件的索引均有效,如今在范围以后再添加一个查询条件:

image.png

key_len依旧保持158,说明票【a=1】这个条件上的索引是失效的。

五、使用不等于操做(!= 或 <>)

image.png

六、使用 is not null 

image.png

七、使用前导模糊查询

先来看后导查询:

image.png

此时索引并无失效,再来看先后导模糊查询:

image.png

此时索引已经失效,那么单独使用前导查询:

image.png

此时索引失效,所以,使用前导查询会致使索引失效。

八、mysql不走索引会有更好的查询性能时索引失效

相关文章
相关标签/搜索