什么情况下索引会失效

一、什么叫做索引失效

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

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

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

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

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

复制代码
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 模糊查询,索引失效。如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效

相关推荐
guo_wen_qiang1 小时前
redis持久化
数据库·redis·分布式
撸串-研究生1 小时前
社区流浪宠物领养救助系统【附源码】
mysql·springboot·宠物·社区公益服务
达梦数据1 小时前
达梦数据复制软件DMDRS搭建部署示例:源数据库DM8到目标数据库Kingbase V8一对一数据同步
数据库·oracle
我命由我123452 小时前
LRU 缓存淘汰策略
数据结构·redis·学习·mysql·算法·缓存·学习方法
ly76892 小时前
MongoDB 读写策略与一致性取舍:readConcern、readPreference 与 causal session
数据库·mongodb·writeconcern·readconcern·readpreference·因果一致性
天空属于哈夫克32 小时前
企业微信消息回调处理:如何避免慢查询拖垮整个服务?
数据库·php·企业微信
烟雨归来2 小时前
Oracle备份NFS IO挂死引发PQ并行进程耗尽process
数据库·oracle
acd120092 小时前
PHP 8.1 下 Swoole 协程 PDO 偶尔出现 MySQL 连接丢失问题排查
数据库·oracle
cc5725026532 小时前
2027校招:大数据管理与应用转财务数字化,会计业务、SQL与BI学习路线
数据库·sql·学习