快速吃透 MySQL 索引:B+Tree、聚簇索引、最左前缀、覆盖索引、索引失效
· 阅读需 25 分钟
面试问 MySQL,十有八九会落到索引上。但很多人对索引的理解是碎片化的:知道"建索引能提速""最左前缀""不要前模糊 LIKE",却说不清索引为什么快、B+Tree 好在哪里、二级索引为什么要回表、EXPLAIN 里的 Using index / Using index condition 到底差在哪。
这篇文章把 MySQL 索引从头到尾串一遍:从数据结构出发,到物理存储,再到联合索引与优化器行为。看完能自己判断"这个 SQL 该建什么索引、会不会命中"。
1. 索引是什么:从"全表扫描"说起
在没有索引的 MySQL 表上查一行数据,InnoDB 只能从第一个数据页开始,把整张表的所有页依次读进内存,逐行比对条件。这就是全表扫描(full scan)——复杂度 O(n),行数一多就慢。
索引做的事情,本质上和书的目录、字典的拼音检字表一样:额外维护一份"有序的、缩小范围的查找路径",用少量 IO 定位到目标,而不是翻遍全书。
索引能提速的本质是把"线性查找"变成"树形查找":读多少次磁盘,取决于树的高度,而不是表的行数。所以下文的一切,都围绕"把树做矮、把路径做窄"展开。
