1.实现索引覆盖的步骤
- 为查询语句的 WHERE 条件、JOIN 条件、ORDER BY 和 GROUP BY 等涉及的字段创建合适的索引(大部分情况下组合索引能够支持更多的索引覆盖使用场景)。
- 在 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 |
+----+-------------+-------+------------+-------+---------------+-------------------+---------+------+------+----------+----------------+