Mysql索引失效情况最全总结

Mysql索引失效的几种情况(概览)

我们在使用MySQL数据库时索引在可以极大的提高查询效率,然而,有时候我们用的不恰当时候反而导致索引失效。如果mysql估计使用全表扫描要比使用索引快,则不使用索引(数据量较小或其他)

  1. 模糊查询时like后面后面紧跟着%,例如:‘like %###’;
  2. or语句前后没有同时使用索引;
  3. 组合索引中不是使用第一列索引;
  4. 在索引列上使用“IS NULL”或“IS NOT NULL”操作;
  5. 在索引字段上使用“not”,“<>”,“!=”
  6. 被索引字段,发生了隐式类型转换(例如:索引字段(phone)是varchar 写sql时候写成 phone=13782011111正确应是phone=‘13782011111’
  7. 被索引字段使用了表达式计算
  8. 被索引字段使用了函数

接下来我们创建一个user表,来解释以上索引失效的具体情况

CREATE TABLE `t_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `age` int(10) NOT NULL,
  `phone` varchar(30) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_age` (`age`),
  KEY `ids_phone` (`phone`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
#插入一条数据
INSERT INTO `ruoyi`.`t_user`(`id`, `name`, `age`, `phone`) VALUES (1, 'lisi', 20, '18382011111');
INSERT INTO `ruoyi`.`t_user`(`id`, `name`, `age`, `phone`) VALUES (2, '张三', 25, '18600010000');

1、like关键字后使用左模糊匹配’%##’

1.1、放在最左边索引失效在这里插入图片描述

1.2、放在最右面就不会出现索引失效

在这里插入图片描述

2、or语句前后没有同时使用索引

当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效

2.1、 or左右只有一个索引时候索引失效

在这里插入图片描述

2.2、or左右查询字段均为索引时

or两边都有索引

3、组合索引中不是使用第一列索

###3.1、修改我们的表,表中除了主键索引外,我们再添加一个联合索引id_age_phone,在这个联合索引中包含了age字段和phone字段,并且age字段在最左边。
不符合最左原则索引失效
在这里插入图片描述
age放在最左边的时候索引生效在这里插入图片描述

4、在索引列上使用“IS NULL”或“IS NOT NULL”操作

user表name字段加上索引在这里插入图片描述
在这里插入图片描述

5、在索引字段上使用“not”,“<>”,“!=”

在这里插入图片描述

6、被索引字段,发生了隐式类型转换

phone字段是varchar类型,我们可以看到虽然查询语句中的phone的值是一个数字类型的值,与phone的字符串类型不匹配,依然可以查到我们想要的结果,但是在sql执行过程中并没有使用到索引。
在这里插入图片描述
只有这样写的时候索引才生效
在这里插入图片描述

7、被索引字段使用了表达式计算

在这里插入图片描述

8、被索引字段使用了函数

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值