MySQL中索引失效的常见情形

MySQL中索引失效的常见状况

MySQL里对索引进行优化是提升查询性能的重要方式之一,不过有时候因为使用不当会让索引不起作用。接下来我们一同探究哪些情况下索引会失效。

1、联合索引未遵循最左前缀规则

  • 失效的例子:联合索引 (a,b,c)

    SELECT * FROM table WHERE b=1 AND c=2;  -- ❌ 索引失效
    
  • 正确的写法

    WHERE a = ?  -- ✅
    WHERE a = ? AND b = ?  -- ✅
    WHERE a = ? AND b = ? AND c = ?  -- ✅
    -- 注:MySQL对于=条件的列,优化器会按索引顺序重新整合WHERE条件,比如:
    WHERE b = ? AND a = ? AND c = ?  -- ✅ 同样会走索引
    

2、在索引列上运用函数或进行运算

  • 失效的例子

    SELECT * FROM orders WHERE YEAR(create_time) = 2025;  --  ❌ 索引失效
    
  • 正确的写法

    -- 换成范围查询
    SELECT * FROM orders 
    WHERE create_time BETWEEN '2025-01-01' AND '2025-12-31';  -- ✅
    

3、隐式的类型转换

  • 失效的例子:字段类型和查询值的类型不一致

    -- user_id 是 VARCHAR 类型
    SELECT * FROM users WHERE user_id = 1001;  -- ❌ 索引失效(数字转字符串,MySQL得把列值转成数字再比较,没法走索引)
    
  • 正确的写法

    SELECT * FROM users WHERE user_id = '1001';  -- ✅ 保证类型一致
    

4、LIKE 查询时左边加了通配符 %

  • 失效的例子

    SELECT * FROM users WHERE name LIKE '%王';  -- ❌ 索引失效
  • 正确的写法

    SELECT * FROM users WHERE name LIKE '王%';  -- ✅ 能够使用索引

5、OR连接非索引列

  • 失效的例子

    -- age 有索引,address 无索引
    SELECT * FROM users WHERE age > 25 OR address = '北京';  -- ❌ 索引失效
  • 正确的写法
    **

    -- 拆分成 UNION
    SELECT * FROM users WHERE age > 25 
    UNION
    SELECT * FROM users WHERE address = '北京';  -- ✅
    

6、使用 IS NULL / IS NOT NULL

SELECT * FROM users WHERE name IS NULL;  -- ✅ 通常能用索引
SELECT * FROM users WHERE name IS NOT NULL;  -- ❌ 索引不一定会用,一般不能用

7、NOT IN / NOT EXISTS

  • 失效的例子

    SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM blacklist); -- ❌ 索引失效
  • 正确的写法

    -- 改用 LEFT JOIN
    SELECT u.* FROM users u
    LEFT JOIN blacklist b ON u.id = b.user_id
    WHERE b.user_id IS NULL;  -- ✅

有时候会碰到明明使用方法正确,但看执行计划却没走索引的情况,这有可能是数据量比较少时,MySQL自带的优化器觉得全表扫描更快。而且索引失效的情况,我只是列举了几种常见的。像重复索引、索引统计信息过期、范围查询中断联合索引等等,也都会造成索引失效。我们能够依据具体情况来进行分析,对于执行计划的解读,大家可以参考另一篇博文 MySQL EXPLAIN 关键字详解

资本的低迷时期终究会过去。-- 烟沙九洲

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12915.html

(0)
LomuLomu
上一篇 2025 年 7 月 20 日
下一篇 2025 年 7 月 20 日

相关推荐

  • DataGrip激活码永久免费使用方法!

    本指南同样适用于 IntelliJ IDEA、PyCharm、DataGrip、GoLand 等 JetBrains 全家桶产品! 话不多说,先放一张最新版成功激活到 2099 年的截图镇楼,看着就爽! 下面我会用图文结合的方式,手把手教你把 DataGrip 激活到 2099 年。老版本同样适用,无论你用 Windows、macOS 还是 Linux,我都…

    DataGrip激活码 1天前
    2800
  • 2024 DataGrip最新激活码,DataGrip永久免费激活码2024-12-30 更新

    DataGrip 2024最新激活码 以下是最新的DataGrip激活码,更新时间:2024-12-30 🔑 激活码使用说明 1️⃣ 复制下方激活码 2️⃣ 打开 DataGrip 软件 3️⃣ 在菜单栏中选择 Help -> Register 4️⃣ 选择 Activation Code 5️⃣ 粘贴激活码,点击 Activate ⚠️ 必看!必看! 🔥 …

    2024 年 12 月 30 日
    55400
  • 华为OD机试E卷 –羊、狼、农夫过河–24年OD统一考试(Java & JS & Python & C & C++)

    文章目录 题目描述 输入描述 输出描述 用例 题目解析 JS算法源码 Java算法源码 python算法源码 c算法源码 c++算法源码 题目描述 羊、狼、农夫都在岸边,当羊的数量小于狼的数量时,狼会攻击羊,农夫则会损失羊。农夫有一艘容量固定的船,能够承载固定数量的动物。要求求出不损失羊情况下将全部羊和狼运到对岸需要的最小次数。只计算农夫去对岸的次数,回程时…

    未分类 2025 年 1 月 19 日
    40400
  • 2024 GoLand最新激活码,GoLand永久免费激活码2025-01-13 更新

    GoLand 2024最新激活码 以下是最新的GoLand激活码,更新时间:2025-01-13 🔑 激活码使用说明 1️⃣ 复制下方激活码 2️⃣ 打开 GoLand 软件 3️⃣ 在菜单栏中选择 Help -> Register 4️⃣ 选择 Activation Code 5️⃣ 粘贴激活码,点击 Activate ⚠️ 必看!必看! 🔥 获取最新激活…

    2025 年 1 月 13 日
    78500
  • 2025年最新DataGrip永久破解教程 💻 附激活码&注册码一键破解至2099年

    前言 🎯 本教程适用于JetBrains全家桶软件,包括但不限于IDEA、PyCharm、DataGrip、Golang等开发工具。让我们先看看破解成功后的效果,软件有效期直接延长至2099年!🎉 准备工作 📦 下载DataGrip安装包 如果你还没有安装DataGrip,可以前往官网下载最新版本:https://www.jetbrains.com/zh-c…

    2025 年 5 月 13 日
    18600

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信