导读


一个好的SQL语句可以提升数据库查询效率,但是如果SQL查询销量很低的话,就会消耗很长的时间去查询。我这里简单总结下SQL调优的种类与方式吧。

种类


目前就发下这几种,以后发现的话,慢慢补充完善,争取以最全的方式展示出来。

方式一(添加索引INDEX)

索引,简单的可以理解为一篇文章的目录,如果你数据加索引,就可以快速的定位内容在具体位置,快速查询到需要的数据,如果在经常查询的字段添加索引,就可以很大的提高效率。

方式二(IN/NOT IN)

尽量不要使用IN/NOT IN语句,这样每次查询的时候就会遍历整个数据库。如果需要可以使用EXISTS/NOT EXISTS,,因为IN/NOT IN不走索引,这样能提高点查询效率。

方式三(避免在索引上使用计算)

假设有一个薪资表salary,那么我们进行薪资计算的时候。
查询效率低

  1. select * from salary where salary*20>11000(salary是索引列)

查询效率高的

 select * from salary where money>10000/20(salary是索引列)

方式四(LIMIT限制)

如果你确定查询的数据只有一条的话,那么不妨在SQL语句后面加上一个行数限制,这样就不会执行SQL的时候就不会遍历整张表,当查询出某一条合适的数据就会跳出遍历。
比如我们在user表查询第一条地址带有杭州的数据。
效率低

select * form user where address like '%杭州%'

效率高

select * form user where address like '%杭州%' limit 1

当然 分页查询一般也是后面带有limit限制,它的优化可以查看这篇文章:MySQL分页优化

方式五(使用WHERE代替HAVING)

HAVING中的条件一般用于聚合函数的过滤,除此之外,应该将条件写在WHERE字句中。避免使用HAVING字句,这是因为HAVING智慧在检索出所有的几率才会对结果集进行过滤(相当于遍历了整张表),而WHERE是在聚合前刷新记录,如果能通过WHERE字限制记录的数目,就能减少资源消耗。

方式六(用UNION ALL替换UNION)

当SQL语句需要用到UNION来查询两个结果集合时,几遍检索的集合不会有重复的记录,如果使用UNION来查询,同样会进行尝试合并,然后在输出最终结果集前进行排序,因此如果可以确定检索的结果中不会有重复的记录时,应该使用UNION ALL,这样会提高效率。UNION和UNION ALL 的区别,可以查看我这篇文章。MYSQL中UNION和UNION ALL操作符

方式七(使用临时表)

如果数据量很大的时,这个时候可以考虑简历临时表,将临时结果集存在该表中,后面的查询就在该表查询,这样就可以避免查询数据量更多的主表,减少程序中所执行的共享锁阻塞,提高并发效率,当然,也要避免频繁的创建/删除临时表,这样也有可能导致资源消耗更大。

方式八(采用分库分表)

当数据量超级大的时候,或者查询数据要消耗很长时间的时候,这个时候就可以考虑使用分库分表(当然有同一库分多个表,或者同一表分多个库,亦或又分库又分表的),这篇文章介绍了分库的大致思路,可以参考下:SpringBoot动态连接多数据源

END


其他也有很多种,等我慢慢总结吧~