mysql 联合索引 复合索引(abc)如何索引命中规则实测
确实如果在网上搜索关于这相关问题,一些文章中真的说这是错的,但近几年的文章都有说和顺序无关了
实际在本地测一下吧
数据准备
本地 MYSQL版本 8.0.17
mysql创建一张表,表名:‘test_models’
id列为 主键,int类型 ,自增
abcde 全部是int(11)
为(abc)添加一个联合索引 index_abc
执行语句大体这样吧:
CREATE TABLE `test_models` (
`id` INT(11) NOT NULL AUTO_INCREMENT
`a` INT(11) DEFAULT NULL
`b` INT(11) DEFAULT NULL
`c` INT(11) DEFAULT NULL
`d` INT(11) DEFAULT NULL
`e` INT(11) DEFAULT NULL
PRIMARY KEY (`id`)
KEY `index_abc` (`a``b``c`)
);
我用代码往表中写入100万条数据
其中每行数据取值
a 范围 0 - 1000 随机整数
b 范围 0 - 10000 随机整数
c 范围 0 - 100000 随机整数
d 范围 0 - 1000 随机整数
e 范围 0 - 1000 随机整数
开始测试 联合索引(abc)
使用 ‘EXPLAIN’ sql语句查看执行详情
EXPLAIN SELECT * FROM test_models WHERE a = 100 AND b = 1000 AND c = 10000;
image.png
结论(下面结论全部都实际测试过)
AND AND 只要用到了最左侧a列,和顺序无关 都会使用 索引
a = 1 AND b = 2 AND c = 3 ; 使用索引
c = 1 AND b = 2 AND a = 3 ; 使用索引
a = 1 AND b = 2 ; 使用索引
a = 1 AND c = 3 ; 使用索引
c = 1 AND a = 2 ; 使用索引
不包含最左侧的 a 的不使用索引
c = 3 ; 未使用索引
b = 2 ; 未使用索引
b = 2 AND c = 3 ; 未使用索引
c = 1 AND b = 2 ; 未使用索引
OR 不使用索引
a = 1 AND b = 2 OR c = 3 未使用索引
a = 1 OR b = 2 AND c = 3 未使用索引
a = 1 OR b = 2 OR c = 3 未使用索引
最左侧的‘a’列 被大于,小于,不等于比较的 ,不使用索引
a > 1 AND b = 2 AND c = 3 未使用索引
a < 1 AND b = 2 AND c = 3 未使用索引
a > 1 ; 未使用索引
a <> 1 AND b = 2 AND c = 3 未使用索引
最左侧a=某某,后面列大于小于无所谓,都使用索引(但后面必须 and and )
a = 1 AND b < 2 AND c = 3 使用索引
a = 1 AND c = 2 AND b < 3 使用索引
a = 1 AND b < 2 使用索引
a = 1 AND b <> 2 AND c = 3 使用索引
// 可以说 OR一出现就不使用
a = 1 AND b < 2 OR c = 2 未使用索引
ORDER BY
a = 某,后面order 无所谓 都 使用索引 (和最上面的最左匹配一样)
看
a = 1 AND b = 2 AND c = 3 ORDER BY a;// 或者 ORDER BY b , ORDER BY c ,ORDER BY d 使用索引
a = 1 ORDER BY a; // 或者 ORDER BY bORDER BY cORDER BY d 使用abc索引
b = 某,不使用
b = 1 ORDER BY a; //ORDER BY b 都 未使用索引
ORDER BY 似乎没有任何影响,去掉 ORDER BY 确实和上面的测试重复