面试题答案
一键面试常见适用场景
- 单表查询优化:当查询仅涉及索引列时,覆盖索引可避免回表操作,提升查询性能。例如在一个
user
表,有id
(主键)、name
、age
字段,若查询语句为SELECT id, name FROM user WHERE age > 18;
,若在age
字段上创建联合索引(age, id, name)
,则该查询可使用覆盖索引,无需回表获取数据。 - 排序优化:在需要对某些列进行排序操作时,如果排序字段包含在覆盖索引中,能利用索引的有序性高效完成排序。比如在
order
表中有order_id
(主键)、order_date
、amount
字段,若查询SELECT order_id, amount FROM order ORDER BY order_date;
,在order_date
上创建联合索引(order_date, order_id, amount)
,就可借助覆盖索引直接按索引顺序返回数据,提升排序效率。 - 多表关联查询的部分优化:在多表关联查询中,如果关联条件和查询字段能被某个表的索引覆盖,也可提升性能。例如
user
表(user_id
主键,name
)和order
表(order_id
主键,user_id
外键,order_amount
),查询SELECT user.name, order.order_amount FROM user JOIN order ON user.user_id = order.user_id WHERE order.order_amount > 100;
,在order
表的order_amount
和user_id
上创建联合索引(order_amount, user_id)
,可以优化该关联查询中order
表数据的获取。
示例说明
假设存在一张book
表,结构如下:
CREATE TABLE book (
book_id INT PRIMARY KEY,
book_name VARCHAR(255),
author VARCHAR(255),
price DECIMAL(10, 2),
publish_date DATE
);
如果经常有这样的查询需求:SELECT book_id, book_name FROM book WHERE price > 50;
为了优化该查询,可以创建覆盖索引:
CREATE INDEX idx_price_name ON book (price, book_id, book_name);
这样在执行上述查询时,MySQL可以直接从索引中获取所需的book_id
和book_name
列的数据,无需再回表到book
数据页获取,从而提高查询效率。