一架梯子,一头程序猿,仰望星空!
MySQL性能优化面试题 > 内容正文

什么是索引覆盖?如何通过索引覆盖来提高查询性能?


问题简答

索引覆盖是指在查询过程中,所需的数据可以直接从索引中获取(using index),不必再去访问数据表(回表)。这种索引可以提高查询性能,减少了访问数据表的开销和IO操作。

问题详解:

1.实现索引覆盖的步骤

  1. 为查询语句的 WHERE 条件、JOIN 条件、ORDER BY 和 GROUP BY 等涉及的字段创建合适的索引(大部分情况下组合索引能够支持更多的索引覆盖使用场景)。
  2. 在 SELECT 子句中只查询所需字段,且这些字段必须包含在索引字段中。

2.索引覆盖例子

存在一个用户表users,现在需要查询年龄在 20-30 岁之间的用户姓名,下面例子给出索引覆盖的应用。

2.1.创建一个测试表

CREATE TABLE users (
    id INT PRIMARY KEY,
    name  VARCHAR(128),
    age  INT,
    gender  INT,
    address VARCHAR(256)
);

2.2.创建适合的索引

CREATE INDEX idx_age ON users(age, name);

这里选择了年龄和姓名作为组合索引

2.3.SQL查询

SELECT name FROM users WHERE age BETWEEN 20 AND 30;

sql语句出现的所有字段都包含在前面创建的组合索引中。

2.4.Explain分析

explain SELECT name FROM users WHERE age BETWEEN 20 AND 30;

通过explain分析sql,可以发现只有Using index,在索引数据本身就可以查询到所有字段数据,不需要回表查询磁盘中的数据。

+----+-------------+-------+------------+-------+---------------+-------------------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type  | possible_keys | key               | key_len | ref  | rows | filtered | Extra          |
+----+-------------+-------+------------+-------+---------------+-------------------+---------+------+------+----------+----------------+
|  1 | SIMPLE      | users | NULL       | index | NULL          | idx_age | 518     | NULL |    50 |   100.00 | Using index    |
+----+-------------+-------+------------+-------+---------------+-------------------+---------+------+------+----------+----------------+