什么情况下索引会失效

一、什么叫做索引失效

索引失效,是指查询时因为写法或条件的问题,数据库用不上(或只用上一部分)已有的索引,导致加速能力丧失,退化成全表扫描或逐行过滤。数据照样查得出来,结果也对,只是变慢了。

二、什么情况下会导致索引失效

前置知识:最左列与最右列

最左列:写在联合索引定义里最前面的那一列,就是最左列。

最右列:写在联合索引定义里最后面的那一列,就是最右列。

复制代码
CREATE INDEX idx ON table_name (a, b, c);

在以上例子中,a就是最左列,c就是最右列

1、违反了最左前缀法则,索引会失效(或部分失效)。如果建立了联合索引,查询就必须从最左列开始、连续地使用,才能让索引充分发挥作用。如果从最左列开始,但中间跳跃了某一列,那么只有跳跃点之前的那些连续列能生效,跳跃点及之后的列都用不上。

复制代码
CREATE INDEX idx_a_b_c ON table_name (a, b, c);

完全失效:

复制代码
SELECT * FROM table_name WHERE b = 2;

部分失效:只有a生效

复制代码
SELECT * FROM table_name WHERE a = 1 AND c = 3;

只有 a 、b生效 c,d用不上

复制代码
CREATE INDEX idx_a_b_c_d ON table_name (a, b, c, d);

SELECT * FROM table_name WHERE a = 1 AND b = 2 AND d = 4;

2、范围查询右边的列,不能用索引快速定位,只能做普通过滤。

如以下例子,范围查询右边的列,也就是 c,没有使用到索引

复制代码
CREATE INDEX idx_a_b_c ON table_name (a, b, c);

WHERE a = 1 AND b > 2 AND c = 3

3、在索引列上进行运算操作,索引会失效

4、当索引列是字符串类型,而查询时传入的是数字(不加单引号),MySQL 会对索引列做隐式类型转换,导致索引失效。

5、以 % 开头的 Like 模糊查询,索引失效。如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效

相关推荐
SelectDB8 小时前
Apache Doris 与 SelectDB 是什么关系?从开源技术到面向 Agent 的极速分析数据库
大数据·数据库·数据分析
VimorphTech9 小时前
文本已经改了,旧的音频生成结果还能回写吗?
java·数据库·mybatis
SelectDB9 小时前
存算分离冷查询提速 7.5 倍!Apache Doris 4.2 Peer Read 实现跨计算组缓存复用
大数据·数据库·数据分析
盛世宏博智慧档案9 小时前
一站式智慧档案解决方案,如何实现防火防盗漏水多维度安全监测实践
服务器·网络·数据库
GreatSQL9 小时前
GreatSQL 8.0回流MySQL 5.7主从复制中断分析排查过程
mysql
数据库小学妹9 小时前
MySQL磁盘IO瓶颈:iostat与刷脏fsync
数据库·mysql·性能优化
三兔测序学社9 小时前
【零代码生信分析】RNA-seq中级分析11-差异基因进行222种不同类型数据库基因集之间的富集分析
数据库
niuyueyang10 小时前
MCP `/mcp/status` Lifecycle 技术方案
java·服务器·数据库
Umi·10 小时前
MySQL之DQL使用实例
数据库·mysql
牧竹子11 小时前
当前支持向量的主流数据库情况对比
数据库