重点:mysql的最左匹配原则其实是和where后面的查询条件顺序是没有关系的只和索引的字段顺序有关;(这里说的顺序是联合索引的顺序)
这点网上很多地方都说错了
下面我们来用代码模拟一下问题
这里我们创建一个test01表 表中有 abc 三列的复合索引
CREATE TABLE `test01` (
`id` bigint(25) NOT NULL,
`a` bigint(255) DEFAULT NULL,
`b` bigint(255) DEFAULT NULL,
`c` bigint(255) DEFAULT NULL,
`d` bigint(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `abc` (`a`,`b`,`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
- 对于 回表查询 的测试结果
- 按照联合索引的顺序查询结果,可以看到是走了索引的。
- 不按照联合索引顺序查询 ,也是走索引的
- 不按照索引的顺序查询,是不走索引的
- 对于覆盖索引的测试结果
-
按照联合索引的顺序查询结果,可以看到是走了索引的。
-
不按照联合索引顺序查询 ,也是走索引的
总结:通过以上的测试可以看到,对于联合索引,查询时 如果走的是回表查询 走不走索引是和where后面的 字段顺序没有关系的只和联合索引的顺序有关;
查询时如果时 覆盖索引 查询,走不走索引就和任何顺序没有任何关系了。