快捷搜索:  汽车  科技

mysql中索引失效案例分析:mysql索引失效总结

mysql中索引失效案例分析:mysql索引失效总结explain select * from tb_user where profession like '软件%'; explain select * from tb_user where profession like '%工程'; explain select * from tb_user where profession like '%工%';经过上述的测试,我们发现,在like模糊查询中,在关键字后面加%,索引可以生效。而如果在关键字 前面加了%,索引将会失效。 由于下面查询语句中,都是根据profession(专业)字段查询,profession字段是一个普通的索引, 我们主要看一下,模糊查询时,%加在关键字之前,和加在关键字之后的影响。如果字符串不加单引号,对于查询结果,没什么影响,但是数 据库存在隐式类型转换,索引将失效。3、如

首先我们还是先把表结构说下:用户表tb_user结构如下:

CREATE TABLE `tb_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键' `name` varchar(50) NOT NULL COMMENT '用户名' `phone` varchar(11) NOT NULL COMMENT '手机号' `email` varchar(100) DEFAULT NULL COMMENT '邮箱' `profession` varchar(11) DEFAULT NULL COMMENT '专业' `age` tinyint(3) unsigned DEFAULT NULL COMMENT '年龄' `gender` char(1) DEFAULT NULL COMMENT '性别 1: 男 2: 女' `status` char(1) DEFAULT NULL COMMENT '状态' `createtime` datetime DEFAULT NULL COMMENT '创建时间' PRIMARY KEY (`id`) KEY `index_user_pro_age_sta` (`profession` `age` `status`) ) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8

1、不要在索引列上进行运算操作, 索引将失效。

手机号phone字段有唯一索引,当根据phone字段进行函数运算操作之后,索引失效:

//查询手机号最后两位是15的用户 explain select * from tb_user where substring(phone 10 2) = '15';

mysql中索引失效案例分析:mysql索引失效总结(1)

2、字符串类型字段使用时,不加引号,索引将失效。

如果字符串不加单引号,对于查询结果,没什么影响,但是数 据库存在隐式类型转换,索引将失效。

3、如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。

接下来,我们来看一下这三条SQL语句的执行效果,查看一下其执行计划:

由于下面查询语句中,都是根据profession(专业)字段查询,profession字段是一个普通的索引, 我们主要看一下,模糊查询时,%加在关键字之前,和加在关键字之后的影响。

explain select * from tb_user where profession like '软件%'; explain select * from tb_user where profession like '%工程'; explain select * from tb_user where profession like '%工%';

mysql中索引失效案例分析:mysql索引失效总结(2)

经过上述的测试,我们发现,在like模糊查询中,在关键字后面加%,索引可以生效。而如果在关键字 前面加了%,索引将会失效。

4、用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会 被用到。

explain select * from tb_user where id = 10 or age = 23;

mysql中索引失效案例分析:mysql索引失效总结(3)

由于age没有索引,所以即使id有索引,索引也会失效。所以需要针对于age也要建立索引。

5、数据分布影响:如果MySQL评估使用索引比全表更慢,则不使用索引。

猜您喜欢: