MySQL B+树查询过程分为 聚簇索引查询 和 二级索引查询 两种场景:
1.聚簇索引查询(主键查询)
聚簇索引的叶子结点直接存储完整的数据行。查询时:
- 从根节点开始,逐层比较键值,定位到叶子结点。
- 一次B+树搜索即可返回数据。
优势:无需回表,适合主键或范围查询。
2.二级索引查询
二级索引的叶子结点存储主键值,查询时:
- 先通过二级索引B+树找到主键值(如 name=‘Alice’ 对应 id=5)。
- 再用主键值回表到聚簇索引查询完整数据(回表)。
- 例如,SELECT * FROM users WHERE name=‘Alice’ 需要两次B+树搜索。
优化:如果查询字段全在二级索引中(覆盖索引),可避免回表。
3.联合索引与最左匹配
- 联合索引(a,b,c)必须从最左列(a)开始匹配,否则索引失效。
- 例如,WHERE a=1 AND b=2 能用索引,但 WHERE b=2 不能。
4.范围查询优化
- B+树叶子结点的链表结构,使得(如id>10)这类范围查询高效。
- 但二级索引的范围查询可能导致大量的回表,谨慎使用。
总结
设计索引时,优先考虑减少回表,合理使用覆盖索引和联合索引。