sql多表查询语句优化——建立索引

hl.wang

发布于 2019.09.19 18:57 阅读 2418 评论 0

发现问题

       今天通过反馈得知上线的项目由于数据量变大查询效率变得很低,页面响应需要几十秒,造成用户等待时间极长。因此对查询语句进行优化

 

 

 

 

分析问题

       因为是多表查询,因此我们首先来看查询方法是否存在问题,然后再检查是否存在主表数据量远远大于子表的情况,之后再检查是否有建立索引查询。

 

 

 

 

 

 

解决问题

  首先我们贴出查询语句

然后我们贴出在navicat中此语句的查询时间

 

 

 

 

我们执行查询语句发现只有7200条数据居然需要17秒的时间,因此我们首先来观察查询方式,我们用的左连接,众所众知左连接的查询效率不会这么低的,那么就是其他地方的问题,然后我们来观察主表和字表,主表是一个选手表,而子表中包含一个打分记录表。这个可以说明我们的主表数据量不可能远远大于子表,并且还应该是子表数据量远远大于我们的主表,那么就是第三种情况:索引,我们 看了一下表中并没有建立任何索引。

首先我们来用主键建立索引:

建立主键索引之后我们执行一下sql语句看看效果怎么样:

我们发现好像没有什么用,那么难道建立索引没有用吗?

 

 

 

 

 

 

心急的小伙伴可能因此就放弃了建立索引的尝试,但是本人并没有放弃,继续尝试索引,本人下面建立了外键索引。

下面我们来看一下建立了外键索引的运行结果吧:

       哇我们神奇的发现性能提升了几十倍对不对,现在只需要0.5秒了,到了这里,可能有的小伙伴就觉得0.5秒够了,足够了,但是因为要求比较严格,虽然数据库查询是0.5秒左右,但是页面响应还是到达了1秒多,没办法只能继续优化,那接下来该怎么优化呢,通过查阅资料又得知还可以建立联合索引。

 

 

 

 

下面我们来吧主键和外键建立联合索引试一下,看看是否能够继续优化。

       结果发现效率又回到了一开始没有建立索引的时候,这可怎么办,还要怎么样才能优化呢,到了这里有的小伙伴可能走投无路了,觉得放弃了觉得0.5秒勉强也可以,让用户等1s的响应时间也不是不可以,但是本人并没有放弃,在不断尝试中突然想到了一种方法。

 

 

 

 

 

 

主键单独建立索引,外键建立联合索引。

       我们发现激动人心的时刻到了,居然只用了0.2秒,页面响应时间降到了0.6秒,我们发现终于可以满足要求了,但是虽然满足要求了,因此本人是第一次建立索引,所以打算继续研究一下。

 

 

 

 

 

下面我们取消所有的主键索引试一试效率会怎么样。

  我们发现在误差允许的范围内是不影响效率的。

 

 

 

 

最后我们在试一下没有主键索引,外键不采用联合索引测试一下效率

我们发现和有主键索引外键不采用联合索引的效率是一样的。

 

 

 

 

 

总结

       在本次查询语句中场景中查询效率最快的是外键联合索引,次之的是外键单独索引,效率最低的是主键索引和不加索引。