MySQL索引,这回真讲明白了
数据库慢查询是每个后端都会遇到的问题而90%的慢查询问题都可以通过合理设计索引来解决。这篇文章不聊深奥的底层原理从实际使用的角度讲清楚索引。索引到底是什么你可以把索引理解为一本书的目录。没有索引你要从头翻到尾找内容有了索引直接查目录跳到对应页码。MySQL的InnoDB引擎用的是B树索引。叶子节点存储数据非叶子节点只存索引值和指针。B树的好处是树的高度低3层能存几千万条数据范围查询效率高叶子节点有双向指针链。sql-- 没有索引时这条SQL会全表扫描 SELECT * FROM users WHERE email zhangsanexample.com; -- 创建索引后直接走B树查找速度提升几十倍 CREATE INDEX idx_email ON users(email);主键索引与二级索引InnoDB中数据是按照主键组织的所以主键索引的叶子节点直接存储完整的数据行这叫聚簇索引。而普通索引二级索引的叶子节点存储的是主键的值。通过二级索引查数据需要先找到主键再回主键索引取完整数据这个过程叫回表。sql-- 假设users表有主键id还有二级索引idx_name CREATE INDEX idx_name ON users(name); -- 这条SQL只需要查name和id索引里就有不用回表 SELECT id, name FROM users WHERE name 张三; -- 这条SQL要查email索引里没有需要回表取完整数据 SELECT id, name, email FROM users WHERE name 张三;最左前缀原则这是使用联合索引时最重要的原则也是面试高频考点。sql-- 创建联合索引 (name, age, city) CREATE INDEX idx_name_age_city ON users(name, age, city); -- ✅ 能用到索引 SELECT * FROM users WHERE name 张三; SELECT * FROM users WHERE name 张三 AND age 25; SELECT * FROM users WHERE name 张三 AND age 25 AND city 北京; -- ✅ 注意where条件的顺序不影响优化器会自动调整 SELECT * FROM users WHERE age 25 AND name 张三; -- 也能用到 -- ❌ 用不到索引跳过了name SELECT * FROM users WHERE age 25; SELECT * FROM users WHERE city 北京; SELECT * FROM users WHERE age 25 AND city 北京;联合索引从左往右匹配跳过了前面的字段就用不了索引。所以建联合索引时区分度高的字段放左边。sql-- 假设name区分度比age高这样建更合理 CREATE INDEX idx_name_age ON users(name, age); -- 而不是 idx_age_name覆盖索引与回表前面提到了回表。如果查询的字段都在索引里就不用回表了这叫覆盖索引性能会好很多。sql-- 索引是 (name, age) -- ✅ 覆盖索引查询字段都在索引中 SELECT name, age FROM users WHERE name 张三; -- ❌ 需要回表查询了不在索引中的字段 SELECT * FROM users WHERE name 张三;所以写SQL的时候尽量只查需要的字段少用SELECT *既减少网络传输也可能利用覆盖索引避免回表。索引失效的常见场景实际开发中建了索引但SQL没用上是经常发生的事情。以下场景索引会失效1. 在索引列上用函数sql-- ❌ 索引失效 SELECT * FROM orders WHERE DATE(create_time) 2024-01-01; -- ✅ 改成范围查询 SELECT * FROM orders WHERE create_time 2024-01-01 AND create_time 2024-01-02;2. 隐式类型转换sql-- 假设phone是varchar类型 -- ❌ 索引失效传了数字发生类型转换 SELECT * FROM users WHERE phone 13800138000; -- ✅ 传字符串 SELECT * FROM users WHERE phone 13800138000;3. LIKE以%开头sql-- ❌ 索引失效 SELECT * FROM users WHERE name LIKE %三; -- ✅ 可以用到索引 SELECT * FROM users WHERE name LIKE 张%;4. OR条件中有非索引列sql-- 假设name有索引age没有索引 -- ❌ 索引失效OR两边都要能用索引才行 SELECT * FROM users WHERE name 张三 OR age 25; -- ✅ 把age也建上索引或者用UNION SELECT * FROM users WHERE name 张三 UNION SELECT * FROM users WHERE age 25;5. 索引列参与计算sql-- ❌ 索引失效 SELECT * FROM products WHERE price * 0.8 100; -- ✅ 把计算移到右边 SELECT * FROM products WHERE price 100 / 0.8;6. 使用不等于! 或 或 IS NULLsql-- 不等于和IS NULL通常不走索引 SELECT * FROM users WHERE status ! 1;用EXPLAIN分析SQL遇到慢查询第一件事就是用EXPLAIN看执行计划。sqlEXPLAIN SELECT * FROM users WHERE name 张三;输出结果重点看这几列列名含义关注点type访问类型至少要到range或refALL就是全表扫描possible_keys可能用的索引看有没有预期中的索引key实际用的索引如果是NULL说明索引没用到rows扫描的行数这个值越大性能越差Extra额外信息出现Using filesort或Using temporary要警惕type的优劣排序从好到差systemconsteq_refrefrangeindexALL目标至少达到range级别。实战建索引的建议1. 不要建太多索引每个索引都占用磁盘空间且拖慢INSERT、UPDATE、DELETE的速度。一个表一般建议不超过5个索引。2. 区分度不高的字段不建索引比如性别男/女走索引还不如全表扫描快。sql-- 区分度 COUNT(DISTINCT column) / COUNT(*) -- 区分度低于10%的字段建索引效果不好 SELECT COUNT(DISTINCT gender) / COUNT(*) FROM users; -- 约 0.5%3. 长字符串用前缀索引sql-- 只对前20个字符建索引节省空间 CREATE INDEX idx_content ON articles(content(20));4. 频繁查询的字段优先建索引WHERE条件中频繁出现的字段ORDER BY排序的字段GROUP BY分组的字段JOIN连接的条件字段5. 不要用UUID作为主键UUID是随机字符串插入时会导致B树频繁分裂性能很差。建议用自增ID或者有序的雪花ID。总结索引的核心理念就一句话用空间换时间让查询少扫描数据。用好索引的要点搞懂最左前缀原则合理设计联合索引避免索引失效的写法函数、类型转换、前置%用EXPLAIN验证执行计划覆盖索引优于回表索引不是越多越好要精准索引是数据库性能优化的第一板斧掌握好它能解决绝大部分慢查询问题。

相关新闻

实例介绍:Unittest框架及自动化测试实现流程

实例介绍:Unittest框架及自动化测试实现流程

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快Unittest框架介绍Unittest框架是Python中一个标准的库中的一个模块,该模块包括许多的类如 test case类、test suit类、texttest runner类、texttest res…

2026/7/18 23:39:02阅读更多 →
【限时福利】8元无门槛红包,手慢无!

【限时福利】8元无门槛红包,手慢无!

🔥 8元无门槛红包,人人可领!领取口令:新用户福利018077点外卖、打车、购物都能直接抵扣!活动限时,数量有限,先到先得!

2026/7/18 23:39:02阅读更多 →
泰坦尼克号观后感:那些留在心里的片刻

泰坦尼克号观后感:那些留在心里的片刻

《泰坦尼克号》给我的第一印象不是热闹,而是一种很稳的叙事耐心。它没有依赖夸张反转制造刺激,而是把人物放进真实处境里推进,让每个决定都有重量。最打动我的是结尾留下的余味,不解释太满,却让主题更清晰。发布时间&a…

2026/7/18 23:39:02阅读更多 →
LinearGradient 线性渐变:从暖金到琥珀的品牌色应用

LinearGradient 线性渐变:从暖金到琥珀的品牌色应用

前言 渐变是提升 UI 视觉品质的重要手段。HarmonyOS 提供了 LinearGradient 和 RadialGradient 两种渐变方式,支持多色阶、角度控制等高级功能。 “海风日记“以“日落海景“为设计灵感,围绕暖金、琥珀、橙色的渐变体系建立了完整的品牌视觉语言。全项…

2026/7/19 1:23:18阅读更多 →
5分钟掌握Windows窗口自由:WindowResizer强制调整任意窗口大小

5分钟掌握Windows窗口自由:WindowResizer强制调整任意窗口大小

5分钟掌握Windows窗口自由:WindowResizer强制调整任意窗口大小 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些固执的Windows窗口而烦恼吗?老旧软…

2026/7/19 1:23:18阅读更多 →
Java架构师核心能力:从并发编程到分布式系统设计

Java架构师核心能力:从并发编程到分布式系统设计

1. 从Java开发者到架构师的思维跃迁第一次被称作"架构师"的那个下午,我正对着白板上的分布式事务方案发呆。团队里新来的应届生指着我说:"这个问题得问架构师",我才意识到角色已经转变。Java架构师不是简单的职称升级&am…

2026/7/19 1:23:18阅读更多 →
Android NDK开发实战:性能优化与JNI接口详解

Android NDK开发实战:性能优化与JNI接口详解

1. 初识Android NDK开发第一次接触NDK开发是在2018年,当时接手一个需要处理大量图像运算的相机项目。Java层的处理速度始终达不到产品要求,帧率卡在15fps上不去。团队里的老工程师建议:"试试用C重写核心算法吧"。就这样&#xff0c…

2026/7/19 1:23:18阅读更多 →
震撼!金华GEO优化案例揭秘,效率提升竟然如此简单!

震撼!金华GEO优化案例揭秘,效率提升竟然如此简单!

引言在数字化转型的浪潮中,越来越多的企业开始意识到生成式引擎优化(GEO)的重要性。特别是对于浙江省的制造业重镇——金华而言,五金制造、新能源汽车零部件、电子商务及生物医药四大支柱产业正面临前所未有的挑战与机遇。本文将通…

2026/7/19 1:23:18阅读更多 →
Python爬虫实战:慕课网课程数据采集与分析

Python爬虫实战:慕课网课程数据采集与分析

1. 项目背景与需求分析慕课网作为国内知名的IT技能学习平台,汇集了大量优质的编程课程资源。对于学习者而言,快速获取完整的课程信息(如课程名称、讲师、价格、评分、学习人数等)能够帮助其高效筛选适合自己的学习内容。传统手动收…

2026/7/19 1:21:18阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →