2026北京黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
2026/6/30 5:02:22
好的!我们用通俗的例子和索引的底层原理来解释为什么优化器会优先使用联合索引的前导字段(即联合索引的第一个字段),以及为什么这种设计更高效。
数据库索引(如InnoDB的B+树索引)本质上是一个有序的数据结构,类似于字典的目录。它的核心特点是:
假设有一个联合索引(A, B),它的存储结构如下:
A的值和指向下一层的指针。A和B的值,以及指向数据行的指针(或主键)。关键点:
联合索引是按照(A, B)的整体顺序排序的,但先按A排序,再按B排序。例如:
(A=1, B=2), (A=1, B=3), (A=2, B=1), (A=2, B=4), (A=3, B=1)...假设查询是:
sql
SELECT * FROM table WHERE A = 2;索引的使用过程:
A=2快速定位到非叶子节点中A=2的范围。A=2的记录(如(A=2, B=1)和(A=2, B=4))。A值。为什么高效?
A排序,所以A=2的记录是连续存储的,一次查找就能获取所有匹配数据。A建索引,效果和联合索引的前导字段A完全一样,但联合索引还能支持A+B的查询。假设查询是:
sql
SELECT * FROM table WHERE A = 2 AND B = 4;索引的使用过程:
A=2定位到叶子节点中A=2的记录范围。B=4过滤,找到(A=2, B=4)。为什么高效?
A缩小了搜索范围(从全表到A=2的记录)。B=4,避免了全表扫描。对比单独索引:
如果只有单独索引B,查询B=4时需要扫描所有B=4的记录,再检查A=2,效率更低。
假设查询是:
sql
SELECT * FROM table WHERE B = 4;索引的使用问题:
(A, B)是先按A排序,再按B排序的。直接查B=4时,B=4的记录可能分散在多个A值中(如(A=1, B=4)、(A=2, B=4)、(A=3, B=4))。B=4的记录,因为它们不连续存储。结果:
优化器无法使用联合索引(A, B),只能选择:
B,则使用它。B,则全表扫描。假设字典的索引是“拼音首字母 + 页码”(类似联合索引(A, B)):
Z)。Z部分,所有Z开头的字是连续的,一页页翻即可。WHERE A = 'Z'(高效)。Z部分,再在Z的范围内找第10页。WHERE A = 'Z' AND B = 10(高效)。A、B、C…Z开头的字。WHERE B = 10(无法直接用“拼音首字母+页码”索引,必须全字典翻找)。反例:
如果查询条件不包含前导字段,联合索引的排序优势无法利用,优化器会选择其他索引或全表扫描。
WHERE、ORDER BY、GROUP BY中的字段放在联合索引的前面。(A,B),可删除单独A)。通过理解索引的排序和存储原理,就能明白为什么前导字段是联合索引的“核心”了!