面试题答案
一键面试覆盖索引提高查询效率的原理
- 索引结构:MySQL 中常见的索引结构如 B+ 树,叶子节点包含索引列和指向数据行的指针(InnoDB 存储引擎中,聚簇索引叶子节点直接存储数据行)。覆盖索引指的是一个查询语句的所有字段,都可以从索引中直接获取,而不需要回表操作。
- 减少 I/O 操作:通常情况下,查询数据时先通过索引找到对应的指针,再根据指针去数据页获取完整数据,这涉及两次 I/O 操作(一次索引页 I/O,一次数据页 I/O)。使用覆盖索引时,由于查询所需数据都在索引中,只需一次 I/O 操作读取索引页,从而减少了磁盘 I/O,提升查询效率。
- 优化器选择:MySQL 的查询优化器会根据查询语句的字段、索引情况等因素,选择使用覆盖索引来执行查询,以达到更高效的执行计划。
显著提升性能的查询场景举例
- 简单查询场景:假设有一张
users
表,包含字段id
(主键)、name
、age
,并且在(name, age)
上建立了联合索引。
在这个查询中,由于要查询的-- 查询语句 SELECT name, age FROM users WHERE name = 'John';
name
和age
字段都包含在(name, age)
联合索引中,MySQL 可以直接通过该索引获取数据,无需回表操作,大大提高了查询性能。 - 统计查询场景:对于
orders
表,有id
(主键)、order_date
、amount
字段,在(order_date, amount)
上建有联合索引。
此查询中,-- 统计某一天的订单总金额 SELECT SUM(amount) FROM orders WHERE order_date = '2023 - 01 - 01';
order_date
和amount
都在索引中,查询优化器会选择使用覆盖索引,避免回表,从而高效地完成统计操作,提升查询性能。