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
上一篇 4小时前
下一篇 2小时前

相关推荐

  • 2025年最新IDEA激活码永久破解教程 – 支持JetBrains全家桶注册码获取

    适用于全系列JetBrains工具的破解方案 本教程完美适配IntelliJ IDEA、PyCharm、WebStorm等JetBrains全系列开发工具,让您轻松获得永久授权! 先展示最新版IDEA成功激活效果,许可证有效期直达2099年,让您畅享编程无忧! 下面将详细图解如何实现IDEA永久激活,本方法同样适用于历史版本! 全平台兼容:Windows/m…

    IDEA破解教程 3天前
    4300
  • 🔥2025最新PyCharm永久激活码分享|100%破解成功教程(支持JetBrains全家桶)

    还在为PyCharm激活发愁?😫 本教程将手把手教你如何永久激活PyCharm至2099年!适用于所有JetBrains产品(IDEA、PyCharm、DataGrip、Goland等),无论Windows、Mac还是Linux系统统统适用!💪 先来看看最新PyCharm版本破解成功的截图,有效期直接拉到2099年,简直不要太爽!🎉 📥 第一步:下载PyCh…

    2025 年 6 月 1 日
    69700
  • 2025年最新IDEA激活码分享 | IDEA永久破解教程及注册码获取指南

    JetBrains全家桶破解全攻略(支持IDEA/PyCharm/DataGrip等) 先给大家展示最新IDEA版本成功破解的截图,有效期直达2099年,完美解决开发者的后顾之忧! 下面将详细介绍如何一步步完成IDEA的永久激活,这个方法同样适用于旧版本,无论您使用什么操作系统或版本,都能轻松搞定! 第一步:获取IDEA安装包 若您已下载安装包,可跳过此步骤…

    IDEA破解教程 4天前
    19300
  • MySQL 安装部署

    概述 本文主要介绍如何在 Linux 中以 RPM 包的方式安装 MySQL 并进行相关的初始化配置,文中方案均已实践验证。 操作系统 CentOS 7.6 数据库版本 MySQL 8.4.3 LTS [!NOTE] 说明 本文主要介绍 RPM 包的安装方式,其他安装方法可查阅官网:MySQL :: MySQL 8.4 Reference Manual ::…

    未分类 2025 年 1 月 11 日
    32100
  • WebScoket-服务器客户端双向通信

    WebScoket学习笔记 1. 消息推送常用方式介绍 轮询 浏览器以指定的时间间隔向服务器发出HTTP请求,服务器实时返回数据给浏览器。 长轮询 浏览器发出ajax请求,服务器端接收到请求后,会阻塞请求直到有数据或者超时才返回。 SSE server-sent-event:服务器发送事件 SSE是在服务器和客户端之间打开一个单向通道,服务器通向客户端。 服…

    2025 年 1 月 16 日
    26200

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信