sql优化应该是基于对数据库优化器和执行计划的深入理解,明白sql语句从解析到执行中间的过程,以及优化器是如何选择某一执行路径作为最终的执行计划。
什么是优化器
优化器是数据库中的一个核心子系统,优化器的目的就是按照一定的规则根据目标sql得到最佳的执行计划。oracle 10g以后默认的优化器是CBO,CBO是基于成本的优化器,mysql的优化器也是基于成本的优化器,成本值,即sql语句需要的io流,cup使用率,网络传输啊,以及相关的统计信息,更加这些统计信息选择成本最低的执行路径作为执行计划。如下图是oracle的sql执行流程。图片来自(基于Oracle的sql优化)
优化的方法
1.查询尽量避免全表扫描,数据量大时,应当考虑在where条件后的某些列建立索引。
2.对where条件 的列 做null 判断,算术符运算,使用 like ‘%test%’ 做模糊查询时,以%为头,进行函数操作都将导致不走索引查询。
3 尽量避免使用in 或not in 将导致不走索引,可以用 between 或 exist 代替。
4 避免select * 的查询 ,不要返回不需要用到的字段。
5.union all 代替union 如何结果集允许重复的话。
6使用预绑定,减少sql的硬解析,充分的利用缓存。
7.order by 的列和join的列尽量索引。
8.用join 连接查询来代替嵌套子查询,因为子查询会生成一张临时表。
9 在表设计时适当的冗余字段,查询减少表的连接。
10 分库分表
总结
很多人以为sql优化就是加索引,这是很肤浅的认识,如果一个表的数据量很大有1000万,加了某个索引,查询出的数据有900万,那么走索引查询还不如走全表扫描,索引查了到数据位置后,还要回表查一次,如果加索引查出的数据占总数很大比重,那么使用索引查询反而会使效率降低。而且比如oracle全表扫描采用多块读,有时候效率反而高于索引查询,只是全表扫描在数据增长之后,其效率会降低的很快,极不稳定。索引查询只是sql优化的一种手段,sql优化的核心还是应当深入的理解优化器和执行计划。