联合索引区分顺序

select * from t where b > 5, c <3, a = 4

建立联合索引a,b,c和建立联合索引b,c,a有区别吗?

答案是有的。

如果创建时间放在第一位,不会走索引。

(由于这一天是压测,创建时间都集中在那一天。)

 

 

 

 

 

 

 如果status放第一位,会走索引。

 

因为联合索引是根据顺序来排序的,先搜索a,再搜索b,再搜索c,如果搜索a的时候,还有很多数据没有过滤,他就会直接走全表扫描。

如上图,如果根据再创建时间过滤,会搜出来很多数据,,而status为1的数据可能只有几条。

所以能根据索引筛选掉很多数据的字段一定要放在前面。

 

后续:领导说如果status放在第一位有可能会导致插入和更新频繁修改索引。我测试了一下,900万条数据插入1条数据的速度在0.01秒左右,create_time放在前面和status放在前面都是差不多的时间。不过最好还是把离散度高的索引放在第一位比较稳妥。

 

posted @ 2021-11-19 11:40  BBI丨BBI  阅读(641)  评论(0)    收藏  举报