MST

星途 面试题库

面试题:MySQL中覆盖索引适用哪些常见场景

请简要阐述MySQL覆盖索引在实际开发中的常见适用场景,并举例说明。
43.8万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

常见适用场景

  1. 单表查询优化:当查询仅涉及索引列时,覆盖索引可避免回表操作,提升查询性能。例如在一个user表,有id(主键)、nameage字段,若查询语句为SELECT id, name FROM user WHERE age > 18;,若在age字段上创建联合索引(age, id, name),则该查询可使用覆盖索引,无需回表获取数据。
  2. 排序优化:在需要对某些列进行排序操作时,如果排序字段包含在覆盖索引中,能利用索引的有序性高效完成排序。比如在order表中有order_id(主键)、order_dateamount字段,若查询SELECT order_id, amount FROM order ORDER BY order_date;,在order_date上创建联合索引(order_date, order_id, amount),就可借助覆盖索引直接按索引顺序返回数据,提升排序效率。
  3. 多表关联查询的部分优化:在多表关联查询中,如果关联条件和查询字段能被某个表的索引覆盖,也可提升性能。例如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_amountuser_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_idbook_name列的数据,无需再回表到book数据页获取,从而提高查询效率。