sql语句性能优化

很常见的一个题目,笔试面试都有。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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值