• ADADADADAD

    MySql学习笔记(九):索引失效[ mysql数据库 ]

    mysql数据库 时间:2024-12-25 09:57:25

    作者:文/会员上传

    简介:

    数据准备:CREATE TABLE `t_blog` (  `id` int(11) NOT NULL auto_increment,  `title` varchar(50) default NULL,  `typeId` int(11) default NULL,  

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    数据准备:

    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

    1、复合索引丢失第一列字段:

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

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

    接下来执行跳过中间字段的情况:

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

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

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

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

    使用  + - * / 等计算

    4、使用了范围导致该索引之后的索引失效

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

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

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

    5、使用不等于操作(!= 或 <>)

    6、使用 is not null 

    7、使用前导模糊查询

    先来看后导查询:

    此时索引并没有失效,再来看前后导模糊查询:

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

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

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

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

    将本文的Word文档下载到电脑

    推荐度:

    下载