登录
原创

对于千万级数据库查询速度优化

发布于 2021-01-16 阅读 750
  • MySQL
原创

一.建立uid和insert_time两个独立索引

  1. 查询语句为:
    select count(*) from table where insert_time >= "2021-01-14 00:00:00" and uid="jh"

查询两次的耗时分别为:103s,102s,查询出的count结果为110万+

  • 这条语句表面是有uidinsert_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

三.总结

由于时间原因,没有大量的去做测试。不过还是很显而易见看出,针对两个字段的查询,建立两个索引可能导致一个索引用不了,引起慢查,强制索引可以提升效率,但是提升有限,最好的解决方案就是建立联合索引。对于千万级的数据,联合索引建立之后,新增和更新的时间并没有巨大的变化,但是查询效率提升了接近百倍

后面作者会细致研究因果,感兴趣可以先关注,后期会更新。

评论区

励志做一条安静的咸鱼,从此走上人生巅峰。

0

0

0

举报