面试题答案
一键面试MySQL B+树索引联合索引最左匹配原则
- 原则阐述:联合索引是由多个字段组成的索引。最左匹配原则指的是在使用联合索引时,MySQL会从索引的最左边开始匹配,依次按照索引定义的字段顺序去使用索引,只有查询条件中包含最左边的字段,索引才有可能被使用。如果查询条件中缺少最左边的字段,那么索引将无法被充分利用,甚至完全不使用该联合索引。
- 原理分析:B+树索引的结构决定了其按照索引字段顺序进行排序存储。以联合索引 (col1, col2, col3) 为例,B+树首先按照col1进行排序,在col1相同的情况下再按照col2排序,以此类推。所以只有从最左边的col1开始匹配,才能利用到这种有序性来快速定位数据。
复杂查询语句中利用最左匹配原则优化查询性能示例
假设我们有一张 users
表,包含字段 id
、name
、age
、city
,并且创建了联合索引 idx_name_age_city (name, age, city)
。
- 示例查询语句及优化:
- 查询1:
SELECT * FROM users WHERE name = 'John' AND age = 30 AND city = 'New York';
- 分析:此查询条件完全符合联合索引
idx_name_age_city
的最左匹配原则,MySQL可以利用该联合索引快速定位到满足条件的数据,性能较好。
- 分析:此查询条件完全符合联合索引
- 查询2:
SELECT * FROM users WHERE age = 30 AND city = 'New York';
- 分析:查询条件缺少最左边的
name
字段,MySQL无法使用idx_name_age_city
联合索引,只能进行全表扫描,性能较差。
- 分析:查询条件缺少最左边的
- 查询3:
SELECT * FROM users WHERE name = 'John' AND city = 'New York';
- 分析:虽然缺少中间的
age
字段,但由于满足最左匹配原则(有name
字段),MySQL能使用联合索引定位到name = 'John'
的数据,然后在这些数据中筛选出city = 'New York'
的记录。不过相比查询1,性能会稍差,因为没有完全利用到联合索引的所有字段。
- 分析:虽然缺少中间的
- 查询1:
- 涉及排序操作时的优化:
- 查询4:
SELECT * FROM users WHERE name = 'John' ORDER BY age;
- 分析:满足最左匹配原则,MySQL可以利用联合索引先定位到
name = 'John'
的数据,并且由于联合索引中age
字段在name
之后是有序的,所以可以直接利用索引进行排序,无需额外的排序操作(filesort),提高了查询性能。
- 分析:满足最左匹配原则,MySQL可以利用联合索引先定位到
- 查询5:
SELECT * FROM users WHERE name = 'John' ORDER BY city;
- 分析:虽然满足最左匹配原则,但
city
字段在联合索引中不是紧挨着name
的,MySQL在利用索引定位到name = 'John'
的数据后,无法直接利用索引对city
进行排序,可能需要额外的排序操作(filesort),性能相对较差。
- 分析:虽然满足最左匹配原则,但
- 查询4:
通过合理设计联合索引,并在查询中遵循最左匹配原则,可以显著提高包含多个字段筛选以及排序操作的复杂查询的性能。