版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013810234/article/details/80902295
需求
在前端表格处需要显示一些附加信息。便要额外连接两张表。
背景
- 5张表联查,数据量最大的一张表中包含100+万条数据;
- 二手项目,刚开始并没有仔细查看每个字段定义;
动手开干
阅读了SQL后,直接将已有的三张表与新的两张表LEFT JOIN起来。到前端一刷新,好慢(实际上,这中间隔了大概一周时间,又新增了几十万数据,普遍反应太慢!),大约需要20+s;
然后,从前端到后端,分析了整个流程后,确定问题应该出在后端查询;
可是再次看了遍SQL,并没有发现什么异常……
误入歧途
怀疑是新连接的两张表的问题,可是去掉添加的新连接后,依然很慢,所以,之前的SQL就是有问题的!!
Solution
- 将后台SQL语句放到数据库直接执行,果然很慢;揉了揉眼睛,开始看第三遍,这次看到连接条件处时,我停住了;
- 5张表,4个连接,其中3个连接是通过主键关联,剩下一个是叫做
code
的字段,经确认code
是一个普通字段,但是在表中应该是不存在重复值的。 - 我们知道,索引是影响查询效率的主要因素。 随即给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!