添加唯一索引(UNIQUE)后,联表查询效率提升了20+倍

需求

在前端表格处需要显示一些附加信息。便要额外连接两张表。

背景

  • 5张表联查,数据量最大的一张表中包含100+万条数据;
  • 二手项目,刚开始并没有仔细查看每个字段定义;

动手开干

阅读了SQL后,直接将已有的三张表与新的两张表LEFT JOIN起来。到前端一刷新,好慢(实际上,这中间隔了大概一周时间,又新增了几十万数据,普遍反应太慢!),大约需要20+s;

然后,从前端到后端,分析了整个流程后,确定问题应该出在后端查询;

可是再次看了遍SQL,并没有发现什么异常……

误入歧途

怀疑是新连接的两张表的问题,可是去掉添加的新连接后,依然很慢,所以,之前的SQL就是有问题的!!

Solution

  1. 将后台SQL语句放到数据库直接执行,果然很慢;揉了揉眼睛,开始看第三遍,这次看到连接条件处时,我停住了;
  2. 5张表,4个连接,其中3个连接是通过主键关联,剩下一个是叫做code的字段,经确认code是一个普通字段,但是在表中应该是不存在重复值的。
  3. 我们知道,索引是影响查询效率的主要因素。 随即给code字段添加了UNIQUE唯一索引。前端再次刷新,秒级别,快得不像话,太感人~

问题解决~

简直了,就这么一个简单的字段唯一索引,添加之后,查询效率竟提升了20多倍,不可思议!

SQL优化,长路漫漫呀~

Analysis

思考后发现,其实,UNIQUE索引是为了限制数据表中该字段不重复的,为唯一性提供保证;其直接目的并不是为了提升查询效率;
所以这是开始在数据库表设计时埋的一颗雷……

Best Practice

如果可以确定某个数据列将只包含互不相同的值,在建表时就应该使用UNIQUE关键字,将其定义为唯一索引。


If you have any questions or any bugs are found, please feel free to contact me.

Your comments and suggestions are welcome!

你可能感兴趣的:(Database)