索引失效的14种常见场景

在 MySQL 中,索引有时可能会失效,导致查询性能下降。以下是常见的 14 种场景,在这些场景下,索引可能会失效

1. 使用 OR 连接多个条件

  • 场景: 当查询中包含 OR 时,如果 OR 连接的多个条件中有一个没有使用索引,可能会导致索引失效。
  • 例子:
    SELECT * FROM employees WHERE age = 30 OR name = 'John';
    
    这个查询中,age = 30 可能使用索引,但 name = 'John' 没有索引时,MySQL 会放弃使用索引。

2. 在查询中使用函数

  • 场景: 如果查询中在索引列上应用了函数,索引可能失效。
  • 例子:
    SELECT * FROM employees WHERE YEAR(birthdate) = 1990;
    
    这里对 birthdate 使用了 YEAR() 函数,导致索引失效。

3. 使用 LIKE 开头的模糊匹配

  • 场景: 当 LIKE 操作符以通配符 % 开头时,索引会失效。
  • 例子:
    SELECT * FROM employees WHERE name LIKE '%John';
    
    由于 % 位于开头,MySQL 无法使用索引优化查询。

4. 在查询条件中使用 NOT

  • 场景: 使用 NOT 操作符时,索引可能会失效,尤其是与 INLIKE 一起使用时。
  • 例子:
    SELECT * FROM employees WHERE NOT age = 30;
    
    NOT 会导致索引失效,MySQL 可能会选择全表扫描。

5. 使用 IS NULLIS NOT NULL

  • 场景: 当查询条件使用 IS NULLIS NOT NULL 时,索引可能不会被使用。
  • 例子:
    SELECT * FROM employees WHERE salary IS NULL;
    
    使用 IS NULL 时,索引可能不会被有效利用。

6. 范围查询后再进行其他条件筛选

  • 场景: 使用范围查询(BETWEEN<> 等)后,再添加其他条件,索引可能失效。
  • 例子:
    SELECT * FROM employees WHERE age BETWEEN 30 AND 40 AND name = 'John';
    
    这里,age 使用了范围查询,name 的条件可能无法使用索引。

7. 联合索引的列顺序不匹配

  • 场景: 使用联合索引时,如果查询的列顺序与索引创建时的顺序不匹配,索引可能会失效。
  • 例子:
    CREATE INDEX idx_name_age ON employees (name, age);
    SELECT * FROM employees WHERE age = 30 AND name = 'John';
    
    如果 age 在联合索引中排在 name 后面,这种查询会导致索引失效。

8. 使用 DISTINCTGROUP BY

  • 场景: 如果查询中使用了 DISTINCTGROUP BY,索引可能无法被完全利用。
  • 例子:
    SELECT DISTINCT name FROM employees WHERE age = 30;
    
    DISTINCTGROUP BY 可能导致索引不完全被利用。

9. 在查询中使用 LIMIT

  • 场景: 当查询包含 LIMIT 子句时,如果没有明确的排序索引,MySQL 可能无法使用索引。
  • 例子:
    SELECT * FROM employees WHERE age = 30 LIMIT 10;
    
    如果没有 ORDER BY,MySQL 可能不会使用索引来限制结果数量。

10. 数据类型不匹配

  • 场景: 如果查询中使用的列的数据类型与索引列的数据类型不匹配,可能导致索引失效。
  • 例子:
    SELECT * FROM employees WHERE salary = '30000';
    
    如果 salaryINT 类型,而查询中使用了字符串类型的 30000,索引可能失效。

11. 使用 JOIN 时连接条件没有使用索引

  • 场景: 当连接条件(ON 子句)没有涉及索引时,索引会失效。
  • 例子:
    SELECT * FROM employees e JOIN departments d ON e.department_id = d.id;
    
    如果 department_id 没有索引,查询可能会进行全表扫描。

12. 使用 OR 和不等于条件(<>

  • 场景: 使用 OR 连接时,如果条件中有不等于(<>)操作符,索引可能失效。
  • 例子:
    SELECT * FROM employees WHERE department_id = 1 OR department_id <> 2;
    
    这种情况下,索引可能无法完全利用。

13. 字符串拼接或连接运算

  • 场景: 当查询条件中对列进行拼接或连接运算时,索引会失效。
  • 例子:
    SELECT * FROM employees WHERE CONCAT(first_name, ' ', last_name) = 'John Doe';
    
    这种字符串连接操作会导致索引无法使用。

14. 隐式类型转换

  • 场景: 如果查询中对列进行隐式类型转换,索引可能无法使用。
  • 例子:
    SELECT * FROM employees WHERE salary = '30000.00';
    
    如果 salary 列是 FLOAT 类型,而查询使用了字符串 '30000.00',这可能导致隐式类型转换,从而使索引失效。

总结

  • 常见原因: 使用 OR、函数、范围查询、LIKE 开头、NOTIS NULLDISTINCT 等。
  • 避免策略: 尽量避免在查询条件中使用这些情况,或者使用合适的索引(如组合索引、覆盖索引)来优化查询。

本文由mdnice多平台发布

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容

  • 使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是 如何处理你的SQL语句的。分析你的查询...
    略略略_9528阅读 318评论 0 0
  • 前言 mysql的优化最常见的就是对索引的优化,在《一文彻底读懂Explain[https://www.jians...
    杯叔书阅读 1,441评论 0 14
  • 在 MySQL 中,索引 是通过特定的数据结构来加速查询操作。MySQL 支持多种类型的索引,其中 B+ 树索引 ...
    一场雨一整夜阅读 45评论 0 0
  • 建表 创建索引 索引失效 几种常见情景案例 索引失效针对的组合索引?若一个字段上有多种索引呢?某一索引失效,可以继...
    YuZhuo_君阅读 588评论 0 0
  • 1. 索引是什么? 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里...
    胡小毛阅读 406评论 1 5