网上有关SQL优化的方案有很多,但多是杂乱无章。近日闲暇抽空整理了一下,方便大家以后的查阅,若发现其中有什么问题和不全,欢迎大家在下面纠正和补充:

1. 对于SQL语句的性能优化,主要体现在对于查询语句的优化上,要尽量避免全表扫描,首先需要注意的就是在 where 和 order by 涉及的列上添加索引,索引的作用就相当于告诉数据库直接从哪里取数 据就可以了,不用全部查找一遍;

2. 慎用 in 和 not in,使用 in 写出来的SQL的优点是比较容易写及清晰易懂, 但是用 in 的SQL语句执行效率非常低,下面是一个例子:

   SELECT d.eid FROM dept d WHERE d.eid IN (SELECT e.eid FROM employee e)

 使用 exists 代替 in 是一个不错的选择:

   SELECT d.eid FROM dept d WHERE EXISTS (SELECT 1 FROM employee e WHERE e.eid = d.eid)

 同理,not in 也用not exists 来替代;

3. 尽量避免在 SQL语句中对字段进行 NULL 值判断,对NULL值的判断会导致引擎放弃使用索引而去做全表扫描,推荐做法为:用其它相同功能的操作运算来代替;例如:

   SELECT e.name, e.sex, e.addr FROM employee e WHERE e.eid IS NOT NULL

   优化方案为: SELECT e.name, e.sex, e.addr FROM employee e WHERE e.eid > 0

 总之,最好不要给数据库留下 NULL 值,使用 NOT NULL 填充数据库;

4. 尽量不要用between .. and  ... ,使用  >=  和 <= 来代替:

 SELECT d.did, d.dno, d.eid FROM dept d WHERE d.did BETWEEN 1 AND 5

   替换为: SELECT d.did, d.dno, d.eid FROM dept d WHERE d.did >= 1 AND d.did <= 5 ;

5. LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好会产生性能上的问题,例如使用含有 like '%bc%' 的语句进行查询的时候不会引用索引,而使用

 like 'bc%'  可以使用索引,虽然在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。

6. 尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引而另外一个字段没有索引,将导致数据库引擎放弃放弃使用索引而进行全表扫描,例如:

   SELECT d.dname FROM dept d WHERE d.did = 1 OR d.eid = 1001

   可以换成: SELECT d.dname FROM dept d WHERE d.did = 1 UNION  SELECT d.dname FROM dept d WHERE d.eid = 10017. 使用 group by 时, 最好先把不用的数据排除掉,缩小查询的范  围,从而提升查询效率。可以先在 where 条件里面排除无关数据,然后再进行 group by 操作。

8. 尽量避免在 where 子句中对字段进行表达式或函数操作,这将导致引擎放弃使用索引而进行全表搜索;

9. 如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立 访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。

   SELECT d.dname FROM dept d WHERE d.did = @did

   解决的办法是强制使用索引:SELECT d.dname FROM dept d WITH(INDEX(索引名)) WHERE d.did = @did
10. 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序   相一致。

11. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而    定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。

12. Update 语句,如果只更改1、2个字段,不要 Update 全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志。

13. 对于 UNION 操作符,UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。而实际大部分应用中是不会产生重复的记录。

   SELECT * FROM dept UNION SELECT * FROM emp

   这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。推荐做法是在已知没有重复记录的前提下,使用   UNION ALL 操作符替代 UNION,因为 UNION ALL 操作只是简单的将两个结果合并后就返回。14. 不要用 select * from 【表名】 ,用select 【列名】 from 【表名】 ,不要返回用不到的字段。除非不知道表字段时测试用。

15. 程序进行select 时,后面都要commit,这会释放占用的资源。

16. 尽量不要使用游标,因为游标的效率较低,使用游标不仅占用内存,而且还用不可思议的方式锁定表,它们可以使DBA所能做的一切性能优化等于没做。游标里每执行一次fetch就等于执行一次select。游标并不是不可使用,但如果游标操作的数据超过一万行,就应该考虑改写了。

17. 复杂的SQL往往会消耗大量的资源,能用函数解决,就用函数。

18. 尽量避免大事物操作,提高系统的并发能力。

数据库性能优化之SQL优化的更多相关文章

  1. MySql数据表设计,索引优化,SQL优化,其他数据库

    MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...

  2. DB-SQL-MySQL-杂项-调优:Mysql千万以上数据优化、SQL优化方法

    ylbtech-DB-SQL-MySQL-杂项-调优:Mysql千万以上数据优化.SQL优化方法 1.返回顶部 1. 1,单库表别太多,一般保持在200以下为宜 2,尽量避免SQL中出现运算,例如se ...

  3. DBA 需要知道N种对数据库性能的监控SQL语句

    --DBA 需要知道N种对数据库性能的监控SQL语句 -- IO问题的SQL内部分析 下面的DMV查询可以来检查当前所有的等待累积值. Select wait_type, waiting_tasks_ ...

  4. 数据库性能调优——sql语句优化(转载及整理) —— 篇2

    下面是在网上搜集的一些个人认为比较正确的调优方案,如有错误望指出,定虚心改正 (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中 ...

  5. 数据库性能调优——sql语句优化(转载及整理) —— 篇1

    一.问题的提出                    在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实 ...

  6. MySQL 数据库性能优化之SQL优化

    前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. 优化目标 ...

  7. MySQL 数据库性能优化之SQL优化【转】

    优化目标 减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑, ...

  8. 百倍性能的PL/SQL优化案例(r11笔记第13天)

    我相信你是被百倍性能的字样吸引了,不过我所想侧重的是优化的思路,这个比优化技巧更重要,而结果嘛,其实我不希望说成是百倍提升,“”自黑“”一下. 有一个真实想法和大家讨论一下,就是一个SQL语句如果原本 ...

  9. 大数据量数据库设计与优化方案(SQL优化)

    转自:http://blog.sina.com.cn/s/blog_6c0541d50102wxen.html 一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的 ...

随机推荐

  1. QQ好友的价值玩法 及如何搞到几万好友?

    我们知道,现在的自媒体平台太多了.微信公众号,企鹅媒体平台,今日头条.搜狐.UC.一点等等等. 但是现在的话最主要的就是盈利,我们很多朋友玩自媒体这个在很多平台都有自己的账号和大量的粉丝.但是,最后大 ...

  2. shell中的死记硬背

    一.shell的引号们 1."" -> 双引号(不保留完整内容,比如遇到$, 反引号, \ 等就会执行相应的shell) echo "Today is `date` ...

  3. Makefile中的$(MAKE)

    今天看uboot2018顶层的Makefile中发现文件中export一个MAKE变量,export是为了向底层的Makefile传递这些变量参数,但是找了半天没有找到这个MAKE变量在哪定义的. 决 ...

  4. JAVA基础 - 自定义异常类

    自定义异常类,代码还不是很明白,先存着以后参考. package week6; class ScoreException extends Exception { private static fina ...

  5. [SGU223]Little Kings(状压DP)

    随便DP一下 Code #include <cstdio> int sta[150],cnt[150],tp,n,k; long long dp[12][144][150],Ans; in ...

  6. Uber优步北京第一组奖励政策

    优步北京第一组: 定义为2015年6月1日凌晨前(不含6月1日)激活的司机(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机 ...

  7. 上海Uber优步司机奖励政策(1月11日~1月17日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. day 10 形态学处理 膨胀

    #-*- coding:utf-8 -*- #1.导入包 import cv2 import numpy as np #2.导入图片 img = cv2.imread('home.jpg',0) #3 ...

  9. SAX-xml解析

    <?xml version="1.0" encoding="UTF-8"?><bookstore> <book id=" ...

  10. 说说Ruby中的Symbol类

    相信大多人在学习Ruby过程中,都被Symbol类型迷惑过.因为其他语言基本没有这个类.而且它太灵活了.很多人只知其一不知其二. 本人查了不少资料,自己总结一下. 首先来看一下Ruby之父所著的< ...