很常见的一个题目,笔试面试都有。sql语句性能的衡量,优化措施。
个人看法:
一、目标
短时间内获得高吞吐量数据;避免全表扫描
二、性能衡量以及措施
(一)、索引控制
1、创建
变更少、查询多、值重复度小、数量适当
2、使用
避免索引字段参与函数或运算,否则会丧失索引的快速查找功能
(二)、临时表控制
数量适中,数据量适当
简化SQL语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。
(三)、自身操作符
1、union all----union------or
用union all 代替 union,数据库执行union操作,首先先分别执行union两端的查询,将其放在临时表中,然后在对其进行排序,过滤重复的记录。(当已知的业务逻辑决定query A和query B中不会有重复记录时,应该用union all代替union,以提高查询效率。)
应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描, 可以 使用UNION合并查询
select id from t where num=10 union all select id from t where num=20
2、exists---in between 就不要用 in
3、like
替代substring函数;避免%xxx%的全表扫描
4、别名
5、*
6、limit 1
7、设置默认值替换null
(四)、其它
1、数据类型
数字)不要以字符格式声明数字,要以数字格式声明字符值。(日期同样)否则会使索引无效,产生全表扫描。
变长)选择变长类型,合适存储
避免类型转换
2、预知数据量分布
大表跟小表进行关联查询时,涉及到嵌套查询,先查询小表,然后再联合大表。
3、where
避免字段参与函数或运算
任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
以下为相关文章:
https://blog.csdn.net/yl2isoft/article/details/53066012
http://developer.51cto.com/art/201612/525017.htm
https://blog.csdn.net/u011225629/article/details/50492403/
https://www.cnblogs.com/lddbupt/p/5781831.html
https://www.cnblogs.com/zhangchenliang/p/4266170.html
https://blog.csdn.net/liu_jinchun/article/details/53994602
https://zhidao.baidu.com/question/1736430559420284787.html