某个项目中,编写了大量的SQL脚本,在数据库服务器上执行,而数据库中的数据量巨大,SQL执行过程太慢,因此考虑先从SQL脚本上动刀优化。
这里总结下一些优化点和依据:
sql优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充分利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。
(来自:https://blog.csdn.net/zlggyn/article/details/39997169)
1. WHERE条件中的’in’在逻辑上相当于’or’,不如将or子句分开
例如:
select count(*) from stuff where id_no in('0','1')(23秒)
建议改为:
select count(*) from stuff where id_no='0'
select count(*) from stuff where id_no='1'(3秒)
2. 使用恰当的表连接方式
当使用left join时,无论on的条件是否满足,都会返回左表的所有记录,对于满足的条件的记录,两个表对应的记录会连接起来,对于不满足条件的记录,那右表字段全部是null;
当使用right join时,类似,只不过是全部返回右表的所有记录
当使用inner join时,功能与where完全相同。
3. UNION和UNION ALL效率的区别
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL
4. 避免使用DISTINCT