mysql 联合索引

720 阅读1分钟

最左匹配原则

最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配
假设,我们对(a,b)字段建立一个索引,也就是说,你where后条件为

a = 1
a = 1 and b = 2

是可以匹配你索引的,但是如果你

b=2 and a =1 

也是可以匹配索引的,因为sql优化器会自动调整a,b的顺序
如果执行

b = 2 

是用不到索引的,因为在a有序的情况下,b才有序

最左匹配的原理

建立联合索引的时候从左到右,展现一种全部有序,局部有序的状态,比如建立(a,b),在a有序的条件下,b有序,如下图所示(图片来自网络)

1281680-20190117145740508-758737271.png

联合索引有哪些优点

1 减少开销。建一个联合索引(col1,col2,col3),实际相当于建了(col1),(col1,col2),(col1,col2,col3)三个索引。每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,使用联合索引会大大的减少开销
2 覆盖索引。同样的有复合索引(a,b,c),如果有如下的sql: select a,b,c from table where a=1 and b = 1。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作。
3 索引列越多,通过索引筛选出的数据越少

项目实战

1 SELECT * FROM table WHERE a = 1 and b = 2 and c = 3; 如何建立索引
(a,b,c),(b,c,a),(c,a,b)都可以
2 SELECT * FROM table WHERE a > 1 and b = 2; 如何建立索引
要想匹配到a,b,但是a又是范围查找,所以只能建立(b,a),这样优化器会帮我们优化为b=2 and a > 1
3 SELECT * FROM table WHERE a = 1 ORDER BY b;
对(a,b)建立索引,在a有序的情况下,b相对有序。如果换成a>1 order by b ,只需要对a建立索引即可,因为遇到范围查询

常见建索引问题

1 性别只有男女的情况,该字段是否建立索引
区分度低,不需要建立索引
2 状态字段是否建立索引
需要,区分度低的放在联合索引的后边