MySQL索引最左匹配原则
程序员文章站
2022-04-05 23:38:30
...
一、explain 关键字
在弄懂MySQL索引的最左匹配原则之前,我们需要先了解一下 explain 关键字
我在学习explain关键字的时候找到了一张很好的图,但是我现在找不到出处了,只记得是在思否上面的,如果侵权联系我删掉
二、创建数据库
create table test(
a int ,
b int,
c int,
d int,
key index_abc(a,b,c)
)engine=InnoDB default charset=utf8;
DROP PROCEDURE IF EXISTS proc_initData;
DELIMITER $
CREATE PROCEDURE proc_initData()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=10000 DO
INSERT INTO test(a,b,c,d) VALUES(i,i,i,i);
SET i = i+1;
END WHILE;
END $
CALL proc_initData();
这样我们就插入了1000条数据,和创建了a b c的联合索引
三、最左匹配原则
我们知道给字段创建了索引,只有我们使用了该字段,才会使用上索引,上面创建了联合索引 abc,假设我们不知道索引的使用规则,我们以最基本的思考,a、b、c,三个变量能够组合成多少种情况呢?
索引字段 | 具体使用 | 是否使用索引 |
---|---|---|
a | select * from test where a < 10 | 是 |
b | select * from test where b < 10 | 否 |
c | select * from test where c < 10 | 否 |
a、b | select * from test where a < 10 and b < 10 | 是 |
b、a | select * from test where b < 10 and a < 10 | 是 |
a、c | select * from test where a < 10 and c < 10 | 是 |
c、a | select * from test where c < 10 and a < 10 | 是 |
b、c | select * from test where b < 10 and c < 10 | 否 |
c、b | select * from test where c < 10 and b < 10 | 否 |
a、b、c | select * from test where a < 10 and b < 10 and c < 10 | 是 |
a、c、b | select * from test where a < 10 and c < 10 and b < 10 | 是 |
b、a、c | select * from test where b < 10 and a < 10 and c < 10 | 是 |
b、c、a | select * from test where b < 10 and c < 10 and a < 10 | 是 |
c、a、b | select * from test where c < 10 and a < 10 and b < 10 | 是 |
c、b、a | select * from test where c < 10 and b < 10 and a < 10 | 是 |
注:上面代码都是sql,如果你想验证是否使用索引,在sql前面加上explain关键字即可
从上面的表格中我们可以做如下总结(也就是最左匹配原则了)
- 索引的使用只和字段有关,和字段的排序无关
- 从上面我们可以得出,创建了4个索引,a、ab、ac、abc(注意排序无关)
- 最左匹配原则就是只要使用到了组合索引的第一个,索引即可生效
本文参考: