mysql索引

mysql 最左匹配原则理解

mysql 最左匹配原则跟where条件顺序有没有关系呢?

经过验证,没有关系,只要where条件中的字段能跟索引字段匹配,且满足最左匹配原则就可以使用索引

接下来我们通过实际的案例来进行说明

建表语句

1
2
3
4
5
6
7
8
9
10
CREATE TABLE `test_index` (
`a` int DEFAULT NULL,
`b` int DEFAULT NULL,
`c` int DEFAULT NULL,
`d` int DEFAULT NULL,
KEY `ab` (`b`,`a`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

# 初始化语句
insert into test_index VALUES(1,1,1,1), (2,2,2,2), (3,3,3,3);

索引分析

执行如下的sql,查看执行结果

1
2
3
4
# 第一个sql
explain SELECT * from test_index t where t.b = 1 and t.a= 1;
# 第二个sql
explain SELECT * from test_index t where t.a = 1 and t.b= 1;

第一个sql执行结果

sql执行结果1

第二个sql执行结果

sql执行结果2

可以看到两个sql执行结果分析是一致的,也就是where条件字段不影响索引的使用

我们去掉sql中的b条件,再次执行sql

1
explain SELECT * from test_index t where t.a= 1;

执行结果如下:

执行结果分析

此时我们可以看到,我们的索引失效了,进行了全表查询

explain 字段说明

rows

表示扫描了多少行

extra

Using fileSort

告诉我们,mysql进行了排序操作。

如果我们手动进行了排序,即使用了order by. 我们可以通过把排序字段作为索引字段,来避免出现filesort

发现使用group进行分组的时候,也可能会导致使用filesort

Using where

使用了where条件

Using temporary

表示使用了临时表