面试官:你知道MySQL索引么
我:知道,通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。
面试官:你能说一下联合索引么?它的最左匹配原则是什么
我:联合是#¥%……&(……
正文:
比如:一个表t1有id,c1,c2,c3这四个字段
id | c1 | c2 | c3 |
1 | 1 | 5 | 2 |
2 | 1 | 2 | 3 |
3 | 1 | 2 | 2 |
4 | 1 | 3 | 5 |
5 | 3 | 1 | 6 |
6 | 3 | 2 | 7 |
7 | 4 | 2 | 1 |
8 | 2 | 3 | 1 |
9 | 2 | 4 | 2 |
创建索引:在c1,c2,c3创建一个联合索引:create index `col` on `t1` (`c1`,`c2`,`c3`);
使用索引:
sql1,select * from t1 where c1=1 and c2=2 and c3=2;
sql2,select * from t1 where c1=1 and c2=2 ;
sql3,select * from t1 where c2=2 and c3=2;
explain查看发现sql1,sql2这两个语句都能使用上索引,sql3无法使用。为什么?咱们看一下这个表中联合索引的排列方式,对照上表!
c1 | c2 | c3 |
1 | 2 | 2 |
1 | 2 | 2 |
1 | 3 | 3 |
1 | 5 | 5 |
2 | 3 | 1 |
2 | 4 | 2 |
3 | 1 | 6 |
3 | 2 | 7 |
4 | 2 | 1 |
大致排列方式就这样的,可以看出在c1=**条件的情况下c2和c3都是顺序排好的,但是c2和c3,整列来看不是顺序的,所以就能看出为什么联合索引区间判断的时候后面字段就不能使用索引了。
所以大致能看出点端倪了,最左就是一个依赖标准,后面的全是依靠这种关系一一实现的顺序排列,
来看一下这些索引咋回事,上面的几条sql哪些能使用到?
创建索引:在c1,c2,c3创建一个联合索引:
1,create index `col` on `t1` (`c2`,`c3`,`c1`); 对应sql3可以使用索引;如:c2,c2c3,c2c3c1都能使用
2,create index `col` on `t1` (`c3`,`c2`,`c1`);逻辑和1相同
这样上面的三条查询sql,哪几个可以使用到索引,哪几个使用不到索引?
很显然sql1是可以使用到,无论索引顺序怎样,优化器都能帮你优化使用索引
以上便是最左匹配的大致思路,主要还是要理解排列方式才能更好理解联合索引