一、什么叫做索引失效
索引失效,是指查询时因为写法或条件的问题,数据库用不上(或只用上一部分)已有的索引,导致加速能力丧失,退化成全表扫描或逐行过滤。数据照样查得出来,结果也对,只是变慢了。
二、什么情况下会导致索引失效
前置知识:最左列与最右列
最左列:写在联合索引定义里最前面的那一列,就是最左列。
最右列:写在联合索引定义里最后面的那一列,就是最右列。
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 = 33、在索引列上进行运算操作,索引会失效
4、当索引列是字符串类型,而查询时传入的是数字(不加单引号),MySQL 会对索引列做隐式类型转换,导致索引失效。
5、以 % 开头的 Like 模糊查询,索引失效。如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效