面试题答案
一键面试B+树索引特点
- 数据存储结构:
- 所有数据记录都存储在叶子节点,非叶子节点仅存储索引键值,这使得索引树更加紧凑,能在相同内存页中存储更多索引项,提升索引的查找效率。
- 叶子节点通过双向链表相连,方便范围查询,从一个叶子节点可以快速定位到相邻的叶子节点。
- 查询性能:
- 对于等值查询,时间复杂度为 O(logn),n 为索引节点数。由于 B+树的层级结构,每次查找大致能排除一半的节点,查找效率较高。
- 范围查询时,通过叶子节点的链表结构,可以快速定位到范围的起始节点,然后顺着链表顺序读取,性能也较好。
联合索引特点
- 多列组合:
- 联合索引是由多个列组合而成的索引。例如,CREATE INDEX idx_name ON table_name (col1, col2, col3),这里的 idx_name 就是一个联合索引,包含了 col1、col2 和 col3 三列。
- 最左前缀原则:
- 在使用联合索引时,MySQL 会从索引的最左边开始匹配,只有当最左边的列被使用到查询条件中,才会使用该联合索引。例如,对于联合索引 (col1, col2, col3),查询条件为 WHERE col1 = 'value1' 会使用该索引;查询条件为 WHERE col2 = 'value2' 则不会使用该索引(除非开启了索引提示等特殊情况)。
- 减少索引数量:
- 相比为每个列单独创建索引,联合索引可以在一定程度上减少索引文件的大小,因为多个列的索引信息被合并到一个索引结构中。
联合优化查询性能及举例
- 联合优化原理:
- 假设表中有一个 B+树联合索引 (col1, col2, col3)。在查询语句 WHERE col1 = 'value1' AND col2 = 'value2' AND col3 = 'value3' 中,MySQL 首先利用 B+树索引的结构,从根节点开始查找 col1 = 'value1' 的索引项,找到对应的叶子节点范围。然后在这个范围内,继续查找 col2 = 'value2' 的记录,最后在符合前两个条件的记录中查找 col3 = 'value3' 的记录。通过这种方式,利用联合索引的最左前缀原则和 B+树的高效查找特性,快速定位到满足多个条件的记录,从而优化查询性能。
- 举例:
- 假设有一个
employees
表,包含id
、department
、salary
列,创建联合索引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
条件,性能会低很多。
- 假设有一个