联合索引区分顺序
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放在前面都是差不多的时间。不过最好还是把离散度高的索引放在第一位比较稳妥。
浙公网安备 33010602011771号