MST

星途 面试题库

面试题:MySQL中B+树索引与联合索引如何协同优化查询

请阐述在MySQL里,B+树索引和联合索引各自的特点,以及在一个包含多个条件的查询语句中,它们是怎样联合起来优化查询性能的。并举例说明。
47.8万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

B+树索引特点

  1. 数据存储结构
    • 所有数据记录都存储在叶子节点,非叶子节点仅存储索引键值,这使得索引树更加紧凑,能在相同内存页中存储更多索引项,提升索引的查找效率。
    • 叶子节点通过双向链表相连,方便范围查询,从一个叶子节点可以快速定位到相邻的叶子节点。
  2. 查询性能
    • 对于等值查询,时间复杂度为 O(logn),n 为索引节点数。由于 B+树的层级结构,每次查找大致能排除一半的节点,查找效率较高。
    • 范围查询时,通过叶子节点的链表结构,可以快速定位到范围的起始节点,然后顺着链表顺序读取,性能也较好。

联合索引特点

  1. 多列组合
    • 联合索引是由多个列组合而成的索引。例如,CREATE INDEX idx_name ON table_name (col1, col2, col3),这里的 idx_name 就是一个联合索引,包含了 col1、col2 和 col3 三列。
  2. 最左前缀原则
    • 在使用联合索引时,MySQL 会从索引的最左边开始匹配,只有当最左边的列被使用到查询条件中,才会使用该联合索引。例如,对于联合索引 (col1, col2, col3),查询条件为 WHERE col1 = 'value1' 会使用该索引;查询条件为 WHERE col2 = 'value2' 则不会使用该索引(除非开启了索引提示等特殊情况)。
  3. 减少索引数量
    • 相比为每个列单独创建索引,联合索引可以在一定程度上减少索引文件的大小,因为多个列的索引信息被合并到一个索引结构中。

联合优化查询性能及举例

  1. 联合优化原理
    • 假设表中有一个 B+树联合索引 (col1, col2, col3)。在查询语句 WHERE col1 = 'value1' AND col2 = 'value2' AND col3 = 'value3' 中,MySQL 首先利用 B+树索引的结构,从根节点开始查找 col1 = 'value1' 的索引项,找到对应的叶子节点范围。然后在这个范围内,继续查找 col2 = 'value2' 的记录,最后在符合前两个条件的记录中查找 col3 = 'value3' 的记录。通过这种方式,利用联合索引的最左前缀原则和 B+树的高效查找特性,快速定位到满足多个条件的记录,从而优化查询性能。
  2. 举例
    • 假设有一个 employees 表,包含 iddepartmentsalary 列,创建联合索引 CREATE INDEX idx_emp ON employees (department, salary)
    • 查询语句为 SELECT * FROM employees WHERE department = 'HR' AND salary > 5000
    • 首先,MySQL 利用 B+树索引在索引结构中查找 department = 'HR' 的记录范围,由于 B+树索引的特性,能快速定位到对应的叶子节点范围。然后在这个范围内,根据 salary > 5000 的条件进一步筛选记录,避免全表扫描,大大提升了查询性能。如果没有这个联合索引,可能需要全表扫描 employees 表,逐行判断是否满足 department = 'HR' AND salary > 5000 条件,性能会低很多。