3-002: MySQL 中使用索引一定有效吗?如何排查索引效果?

news/2025/3/18 11:46:27

1. 索引失效的常见原因

虽然索引可以加速查询,但在某些情况下,MySQL 可能不会使用索引,甚至使用索引反而更慢
以下是一些常见导致索引失效的原因:

① 查询条件使用了 != 或 <>
  • 原因:索引通常用于范围或等值查询,而 != 无法高效利用 B+ 树索引。

  • 示例

    SELECT * FROM users WHERE age != 30;
    
    • 失效原因!= 使 MySQL 需要扫描大量行,索引无法高效过滤。
② OR 连接多个条件,但只有部分字段有索引
  • 示例

    SELECT * FROM users WHERE age = 30 OR name = 'Alice';
    
    • 失效原因:如果 name 字段没有索引,MySQL 可能选择 全表扫描 而不是使用 age 的索引。
  • 优化方法:为 name 字段也添加索引,或者拆分查询:

      SELECT * FROM users WHERE age = 30
    UNION
    SELECT * FROM users WHERE name = 'Alice';
    
③ LIKE 以 % 开头
  • 示例

    SELECT * FROM users WHERE name LIKE '%Alice%';
    
    • 失效原因:B+ 树索引按照前缀匹配,以 % 开头无法使用索引。

    • 优化方法:

      • 如果 name需要前缀匹配,可以使用

        前缀索引:

        CREATE INDEX idx_name ON users(name(3)); -- 仅索引前3个字符
        
      • 或者改用,全文索引:

        ALTER TABLE users ADD FULLTEXT(name);
        SELECT * FROM users WHERE MATCH(name) AGAINST('Alice');
        
④ 隐式类型转换
  • 示例

    SELECT * FROM users WHERE phone = 13800001234;  -- phone 是 VARCHAR 类型
    
    • 失效原因phoneVARCHAR,但查询时写成 INT,MySQL 进行隐式转换,导致索引失效。

    • 优化方法:使用正确的数据类型:

         
      SELECT * FROM users WHERE phone = '13800001234';
      
⑤ IS NULL 或 IS NOT NULL
  • 示例

    SELECT * FROM users WHERE address IS NULL;
    
    • 失效原因:B+ 树索引不存储 NULL 值,查询 NULL 可能导致索引失效。
  • 优化方法

    • 避免 NULL 值,改用默认值:

      ALTER TABLE users MODIFY address VARCHAR(255) NOT NULL DEFAULT '';
      
    • 使用 col IS NOT NULL 可能仍然走索引(视索引情况而定)。

⑥ 低选择性字段
  • 示例

    • 失效原因gender 只有 malefemale,选择性低,索引加速效果不明显,MySQL 可能选择全表扫描。
  • 优化方法

    • 索引一般适用于高选择性字段,如 idemail

    • 如果 gender 需要频繁查询,可以考虑

      联合索引,例如:

      CREATE INDEX idx_gender_age ON users(gender, age);
      

      这样,查询 WHERE gender = 'male' AND age > 30时仍能利用索引。


2. 如何排查索引效果?

可以使用 EXPLAIN 命令分析 SQL 是否走索引,以及索引的效率。

① 使用 EXPLAIN 分析 SQL 执行计划
EXPLAIN SELECT * FROM users WHERE age = 30;

返回示例:

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEusersrefidx_ageidx_age4const10Using index
  • type = ref:表示使用了索引。
  • key = idx_age:表示使用了 age 索引。
  • rows = 10:表示扫描了 10 行数据,索引效果较好。

如果 type = ALL,表示全表扫描,说明索引可能失效!


② SHOW INDEX FROM table_name 查看索引
SHOW INDEX FROM users;

查看表 users 上的索引信息,确认索引是否创建正确。


③ ANALYZE TABLE & OPTIMIZE TABLE

如果表数据更新较多,索引可能变得不高效,可以手动优化:

ANALYZE TABLE users;  -- 更新索引统计信息
OPTIMIZE TABLE users; -- 重建索引

总结

影响索引使用的因素是否会导致索引失效解决方案
!= / < >✅ 失效改用 BETWEENIN
OR 但部分字段无索引✅ 失效拆分查询或为所有字段加索引
LIKE '%xxx%'✅ 失效改用前缀索引或全文索引
类型转换✅ 失效确保查询和字段类型一致
IS NULL✅ 可能失效使用默认值替代 NULL
低选择性索引✅ 可能失效使用联合索引提高选择性
EXPLAIN 显示 ALL✅ 失效重新设计索引或优化 SQL

使用 EXPLAIN + SHOW INDEX + ANALYZE TABLE 等工具,可以有效排查 MySQL 索引是否生效,并进行优化。


希望这份索引优化指南对你有帮助!如果有任何疑问,欢迎继续探讨 😊🚀


http://www.niftyadmin.cn/n/5890049.html

相关文章

大型语言模型在工业应用中的局限性:事实性扩充与深入分析

大型语言模型在工业应用中的局限性&#xff1a;事实性扩充与深入分析 摘要 本文深入探讨了大型语言模型&#xff08;LLMs&#xff09;在工业应用中所面临的重大挑战&#xff0c;特别聚焦于其在机械图纸解读、可编程逻辑控制器&#xff08;PLC&#xff09;程序生成以及更广泛的…

[特殊字符] 阿里云计算巢一键部署 OpenManus 社区版:释放 AI 生产力的终极解决方案

&#x1f680; 阿里云计算巢一键部署 OpenManus 社区版&#xff1a;释放 AI 生产力的终极解决方案 &#x1f31f; Manus简介 Manus 是一款通用型 AI 助手&#xff0c;能将想法转化为行动&#xff1a;不止于思考&#xff0c;更注重成果。Manus 擅长处理工作与生活中的各类任务…

Flutter_学习记录_connectivity_plus 检测网络

引入插件 官方网址&#xff1a;https://pub.dev/packages/connectivity_plus 导入头文件 import package:connectivity_plus/connectivity_plus.dart;用StreamSubscription订阅网络监听 late StreamSubscription<List<ConnectivityResult>> _subscription;overri…

【Node.js】--- win11安装 Node.js

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Node.js】--- win11安装 Node.js 开发环…

Mistral OCR:重新定义文档理解的下一代OCR技术

在数字化浪潮中,非结构化数据(如PDF、图像、手写文档)的处理一直是企业的痛点。据统计,全球约90%的组织数据以文档形式存储,但传统OCR工具在复杂文档的理解上存在明显短板。2025年3月,法国AI独角兽Mistral AI推出了Mistral OCR——一款号称“全球最强”的光学字符识别API…

cfi网络安全 网络安全hcip

目录 RIP (路由信息协议) 算法 开销 版本 开销值的计算方式 RIPV1和RIPV2的区别 RIP的数据包 Request(请求)包 Reponse(应答)包 RIP的特征 周期更新 RIP的计时器 1&#xff0c;周期更新计时器 2&#xff0c;失效计时器 3&#xff0c;垃圾回收计时器 RIP的核心思…

芯片研发不需要PPT

在芯片研发的实验室里&#xff0c;工程师的屏幕上跳动着波形图&#xff0c;仿真软件吞吐着海量数据&#xff0c;验证工程师盯着亚稳态问题看到眼睛干涩&#xff0c;而某个角落的会议室里&#xff0c;一群人正对着80页的PPT争论字体格式——这荒诞的场景&#xff0c;像极了芯片设…

2025年 Apache SeaTunnel 2月份社区月报速递

SeaTunnel 社区月报 2025-02期 “ 各位热爱 Apache SeaTunnel 的小伙伴们&#xff0c;SeaTunnel 社区月报来啦&#xff01;” SeaTunnel 正在迅猛发展&#xff0c;这将有利于提升数据同步的高可扩展性、高性能及高可靠性。 SeaTunnel Monthly Merge Stars 感谢以下小伙伴上…