MySQL 索引入门:从 B+ 树到慢查询优化

举报
yd_294192959 发表于 2026/11/07 06:16:11 2026/11/07
【摘要】 刚接手一个慢查询时,很多人第一反应是加索引,但索引为什么能让查询变快、什么时候又会失效,答案都在它的底层结构里。本文从 B+ 树讲起,再落到慢查询优化的具体做法。 一、为什么需要索引没有索引时,数据库要逐行扫描整张表才能找到目标数据,数据量越大越慢。索引相当于书的目录:先通过目录定位到页码,再翻到正文,扫描范围从全表缩小到几行。 二、B+ 树:索引的底层结构MySQL 的 InnoDB 索引...

刚接手一个慢查询时,很多人第一反应是加索引,但索引为什么能让查询变快、什么时候又会失效,答案都在它的底层结构里。本文从 B+ 树讲起,再落到慢查询优化的具体做法。

一、为什么需要索引

没有索引时,数据库要逐行扫描整张表才能找到目标数据,数据量越大越慢。索引相当于书的目录:先通过目录定位到页码,再翻到正文,扫描范围从全表缩小到几行。

二、B+ 树:索引的底层结构

MySQL 的 InnoDB 索引主要用 B+ 树实现。它有三个关键特点:第一,只有叶子节点存放数据,非叶子节点只存放键值和指针,起到导航作用;第二,叶子节点之间用链表连接,范围查询可以顺序扫描;第三,树高通常只有三到四层,一次点查只需要三四次磁盘 IO。

和 B 树相比,B+ 树的数据全部集中在叶子层,非叶子节点更“瘦”,同样大小的节点能装下更多键值,树更矮更宽,查询更稳定;和哈希索引相比,B+ 树支持范围查询和排序,而哈希只擅长等值查询。

三、聚簇索引与二级索引

InnoDB 的主键索引就是聚簇索引,叶子节点直接存放整行数据。二级索引的叶子节点存放的是主键值,查到主键后再回表查聚簇索引才能拿到完整数据。如果查询的列全部包含在索引里,就能用覆盖索引避免回表,这是常见的优化手段。

四、最左前缀与索引失效

联合索引遵循最左前缀原则:对(a,b,c)建立联合索引,查询条件带 a 才能用上,跳过 a 直接查 b 就用不上;遇到范围条件后,后面的列也会失效。常见的失效场景还有:对索引列使用函数或运算、发生隐式类型转换、LIKE 以百分号开头、OR 的一侧没有索引。

五、慢查询优化三步

第一步,用 EXPLAIN 看执行计划,重点关注 type、key、rows 和 Extra。type 为 ALL 说明全表扫描,ref 或 range 通常是好信号;Extra 出现 Using filesort 或 Using temporary 说明需要额外排序或临时表,值得警惕。

第二步,定位慢 SQL。开启慢查询日志,定期用工具聚合分析,优先处理执行次数多、平均耗时长的语句,而不是只盯着单条最慢的。

第三步,对症下药。缺索引就补合适的索引;索引选错就改写 SQL 或用强制索引;深分页避免大 OFFSET,改用主键范围或游标分页;冷数据及时归档,让热表保持精简。

六、索引不是越多越好

索引也要占用磁盘空间,每次写入都要维护,索引太多还会让优化器选错。建索引前先想清楚查询模式,定期清理无用索引,读写比不同,索引策略也不同。

理解 B+ 树只是起点。真正做好慢查询优化,需要把执行计划、索引结构和业务查询模式结合起来看,先定位再动手,优化才有针对性。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。