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 日

相关推荐

  • 2025年最新DataGrip激活码与永久破解教程(支持2099年)

    本方法适用于JetBrains全家桶,包括DataGrip、PyCharm、IDEA、Goland等开发工具! 先来看看最新DataGrip版本成功破解的截图,有效期直达2099年,亲测有效! 下面我将用详细的图文步骤,手把手教你如何将DataGrip激活到2099年。 这个方法不仅适用于最新版本,旧版本也同样有效! Windows/Mac/Linux全平台…

    DataGrip激活码 2025 年 8 月 20 日
    75400
  • MySQL 面试题

    MySQL 中有哪几种锁? 全局锁、行级锁、自增锁、记录锁、外键锁、间隙锁、表级锁、元数据锁、意向锁、临键锁 MySQL 中有哪些不同的表格? 基础表、临时表、系统表、信息表、性能模式表、分区表、外键表、触发器使用的表、存储过程和函数使用的表 简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别? 事务支持 InnoDB:支持事务处理,具有提…

    未分类 2025 年 1 月 10 日
    61100
  • 探秘基础算法中的哈希相关结构

    探索基础算法里的哈希相关构造 目录 一,哈希表概览 二,算法原理与代码实现 1.两数之和 349.两数组交集 面试题01.02.判断字符重排 217.存在重复元素 219.存在重复元素II 692.前k高频单词 45.字母异位词分组 三,算法总结 一,哈希表概览 哈希思想是算法中极为关键的思想,体现的是一种映射关系,而哈希表就是依据哈希思想构建的用于存储数据…

    2025 年 7 月 5 日
    60100
  • 2025年最新DataGrip激活码及永久破解教程(支持2099年)

    前言 本教程适用于JetBrains系列数据库管理工具DataGrip,同时也兼容PyCharm、IDEA等其他开发环境。下面展示的是最新DataGrip版本成功破解的截图,可以看到软件有效期已成功延长至2099年! 本文将通过详细的图文指引,一步步教你如何永久激活DataGrip至2099年。这个方法适用于所有主流操作系统,包括Windows、Mac和Li…

    DataGrip激活码 2025 年 8 月 7 日
    54700
  • 永久datagrip激活码获取方式与最新破解方案

    申明:本教程 DataGrip破解补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 ! DataGrip是 JetBrains 推出的开发编辑器,功能强大,适用于 Windows、Mac 和 Linux 系统。本文将详细介绍如何通过破解补丁实现永久激活,解锁所有高级功能。 如果觉得破解麻烦,可以购买…

    DataGrip激活码 2026 年 1 月 26 日
    76300

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信