一.建立uid和insert_time两个独立索引
- 查询语句为:
select count(*) from table where insert_time >= "2021-01-14 00:00:00" and uid="jh"
查询两次的耗时分别为:103s,102s,查询出的count结果为110万+
- 这条语句表面是有
uid和insert_time两个索引,但是实际查询的时候,explain的结果是,只用了uid索引
2.查询语句为:
select count(*) from table where insert_time >= "2021-01-14 00:00:00"
上面的语句直接去除了uid筛选字段,两次查询的耗时分别为:0.768,0.840,查询出的count结果为126万+
- 上面的查询用到了
insert_time字段的索引,查询时间也有大幅提升,但是由于不是我们所需要的结果,还需要再此基础上再做一次过滤,如果同时有删除和更新的操作,需要锁表,可能会导致数据不一致,不过也有解决方法,暂不细聊
3.查询语句为:
select count(*) from table force index(idx_insert_time) where insert_time >= "2021-01-14 00:00:00" and uid="jh"
这条语句是强制索引,使用insert_time字段的索引,两次查询的耗时分别为:16.127s,15.553s,结果和第一次的结果一样,110万+
- 可以看出这条查询语句明显提升了耗时,
explain结果也是使用了insert_time字段的索引
4.考虑修改索引,但是怕修改之后新增和更新的速度降低,所以先观察一下当前新增一条的时间
- insert三次的耗时分别为:0.032,0.184,0.036
二.删除insert_time索引,新增insert_time,uid的联合索引
1.修改索引之后,
select count(*) from table where insert_time >= "2021-01-14 00:00:00" and uid="jh"
这条语句的两次耗时为:1.342,1.354
explain显示,使用了联合索引
2.新增一条数据,两次执行耗时为:0.143,0.043
3.更新一条数据,执行三次的耗时为:0.095,0.109,0.057
三.总结
由于时间原因,没有大量的去做测试。不过还是很显而易见看出,针对两个字段的查询,建立两个索引可能导致一个索引用不了,引起慢查,强制索引可以提升效率,但是提升有限,最好的解决方案就是建立联合索引。对于千万级的数据,联合索引建立之后,新增和更新的时间并没有巨大的变化,但是查询效率提升了接近百倍
后面作者会细致研究因果,感兴趣可以先关注,后期会更新。