面试题答案
一键面试单列索引
- 索引构建方式:
- 若对A列构建单列索引,MySQL会在A列的值上构建B+树索引。B+树的叶子节点存储着A列的值以及对应的行记录指针(指向表中实际数据行)。同理,对B列和C列构建单列索引时,也分别在各自列的值上构建B+树结构。
- 查询优化器利用索引情况:
- A列索引:当查询条件为
A = 'value1'
时,MySQL查询优化器可以利用A列的索引,通过在B+树中快速定位value1
,从而快速找到对应的行记录指针,直接获取相关数据行。 - B列索引:对于
B > 'value2'
,MySQL可以利用B列索引,从B+树中大于value2
的节点开始遍历,获取满足条件的行记录指针。但由于查询同时需要满足A = 'value1'
和C = 'value3'
,仅靠B列索引可能需要扫描大量不满足其他条件的数据行,性能提升有限。 - C列索引:对于
C = 'value3'
,MySQL可以利用C列索引,在B+树中快速定位value3
获取行记录指针。同样,仅靠C列索引无法高效满足整个查询条件。 - 总体性能:在这种情况下,MySQL可能只能使用其中一个索引(通常选择选择性最高的索引),因为同时使用多个单列索引会导致额外的开销,整体查询性能提升不显著。
- A列索引:当查询条件为
联合索引
- 索引构建方式:
- 以(A, B, C)顺序构建联合索引:MySQL会按照A、B、C列的顺序构建B+树索引。首先以A列的值为键进行排序,对于A列相同的值,再按照B列的值排序,B列相同的值,最后按照C列的值排序。叶子节点存储着这三列的值以及对应的行记录指针。
- 以其他顺序构建联合索引,如(B, A, C)或(C, A, B)等:构建方式类似,只是排序的列顺序不同。
- 查询优化器利用索引情况:
- (A, B, C)联合索引:
- 对于查询
SELECT * FROM your_table WHERE A = 'value1' AND B > 'value2' AND C = 'value3';
,MySQL查询优化器可以先利用A列的值value1
在B+树中定位到A值为value1
的节点范围。 - 然后在这个范围内,根据B列的值,从大于
value2
的节点开始进一步筛选。 - 最后在筛选出的结果中,根据C列的值
value3
精确匹配。这种情况下,索引的使用非常高效,能快速定位到满足所有条件的数据行,大大提高查询性能。
- 对于查询
- 其他顺序联合索引:
- 如果联合索引顺序不是(A, B, C),例如(B, A, C),由于查询条件首先是
A = 'value1'
,MySQL无法直接利用这个索引从B+树的根节点开始快速定位,需要全索引扫描,性能会比(A, B, C)顺序的联合索引差很多。一般来说,联合索引要尽量满足查询条件中列的顺序,且最左前缀原则要遵循,即查询条件从索引的最左边开始连续使用索引列,这样才能最大程度发挥联合索引的优势。
- 如果联合索引顺序不是(A, B, C),例如(B, A, C),由于查询条件首先是
- (A, B, C)联合索引:
综上所述,在这种查询场景下,(A, B, C)顺序的联合索引能最大程度提升查询性能,单列索引性能提升有限,而不恰当顺序的联合索引也无法充分发挥索引优势。