编写高效的sql可以给用户带来好的体验,需要开发这没有意识到这一点因为他们不关心也不知道怎么做。高效的sql可以给用户节省很多时间,这样就不需要dba来找上门,也不需要搭建RCA和性能调优。


性能不好的SQL有需要原因,其中之一是:全表扫描

  1. 什么时候应该用全表扫描

    并不是说用全表扫描的方法来从表中获取数据是糟糕的方式,优化器选择全表扫描的方式而不选择索引的方式基于以下几点:

    a)如果数据量特别大,使用索引的方式不一定会比全表扫描快;

    b)如果查询表中所有的行(没有where)则优化器会选择全表扫描;

    c)如果从表中检索大量数据,索引可能没有任何优势。

    d)如果优化器没有准确的数据分布信息,它可能会选择错误的索引或根本没有索引;

    e)如果where语句中的子查询包含的某些列,则可能导致索引不可用。

  2. 什么时候应该用索引

    优化器选择索引扫描而不选择全表查询的情况基于以下几点:

    a)where语句中的列与现有索引正好匹配;

    b)有DISTINCT,UNION 和ORDER BY 则会用索引查询;

    c)有主键与外键约束则也会用索引;

    d)尽量避免使用order by 。

  3. WHERE语句的陷阱

    因为不好的where语句,可能导致扫描不走索引:

    a)在WHERE子句中使用列,它与索引中的列顺序不匹配;

    b)比较同一表中的列;

    c)选择的列是low-selectivity indexes;

    d)在其中一列使用了count然后让他与一个常量比较;

    e)在其中一列使用function然后让他与一个常量比较;

    f)使用了like

    g)与null 做比较

    h)使用了not

    i)使用了转换值

    j)使用了in

  4. 要编写好的SQL,请避免上面提到的陷阱并采纳以下建议:

    a)范围的话尽量使用between and

    b)如果外部查询有附件条件使用exists或not exists

    c)如果没办法避免order by 则尽量使用索引列

Examples:

黄金法则

  1. 如果代码中包含算数表达式,尽量把他转换成求值的结果;

  2. 在列中避免使用functions

  3. 当你知道一组值的分布时候,尽量别使用<>而是把他转换为>和<的表达式;

  4. 把or 转换为in;

  5. like 要比substring性能好;

  6. 尽量把union用or替代;

  7. 使用CASE来过滤最终的select list

  8. where语句必须按照这些列在索引中出现的顺序使用;

  9. 使用子查询来代替join可以提高一些分组连接的性能;

  10. 使用distinct来代替group by;

  11. 尽量不在语句中使用distinct 和order by 除非你真的需要...

  12. 尽量不用outer join

  13. 子查询中的表如果可以通过from 与主表连接,则尽量别使用子查询;

  14. 所有的表或视图都应该有key field

  15. 尽量使用union all 来代替union;

  16. 我的公众号:

如何编写高效的SQL的更多相关文章

  1. MySql如何编写高效的SQL

    最近应团队要求,研究整理了下,mysql相关的优化,有些是根据实际java项目中碰到的情况经验之谈.欢迎讨论~ SQL 语言是一种强大而且灵活的语言,在使用 SQL 语言来执行某个关系查询的时候,用户 ...

  2. 编写高效SQL最佳实践

    编写高效 SQL 语句的最佳实践 秦玮, 高级软件工程师, IBM 王广成, 软件工程师, IBM 王韵婷, 高级软件工程师, IBM 简介: 本文列举了一些在编写 SQL 查询语句时可能导致 DB2 ...

  3. 编写高效SQL语句(转)

    转至http://blog.csdn.net/u012150457/article/details/41846299 一.编写高效SQL语句 1) 选择最有效的表名顺序(仅适用于RBO模式) ORAC ...

  4. 08 高效的SQL

    编写高效 SQL 需要以下知识 有关所查询内容的物理组织的知识 数据库能做什么的知识, 例如: 如果你不知道跳跃扫描索引及其用途, 那么你可能会看着模式说”索引丢了” SQL 所有错综复杂的知识 对目 ...

  5. Oracle如何写出高效的SQL

    转载:http://www.blogjava.net/ashutc/archive/2009/07/19/277215.html 1.选择最有效率的表明顺序(只在基于规则的优化器中有效) Oracle ...

  6. 编写高效的CSS选择符(节选)

    最右边优先 css选择符是从右向左进行匹配的. 样式系统从最右边的选择符开始向左匹配规则.只要当前的选择符的左边还有其他选择符,样式系统就会继续向左移动,直到找到和匹配的元素,或者因为不匹配而退出. ...

  7. js学习笔记-编写高效、规范的js代码-Tom

    编写高效.规范的js代码: 1.变量命名空间问题,尽量使用局部变量,防止命名冲突(污染作用域中的全局变量):全局空间命名的变量可以在对应的文档域任意位置中使用window调用. 2.尽量使用单var定 ...

  8. 编写高效的Android代码

    编写高效的Android代码 毫无疑问,基于Android平台的设备一定是嵌入式设备.现代的手持设备不仅仅是一部电话那么简单,它还是一个小型的手持电脑,但是,即使是最快的最高端的手持设备也远远比不上一 ...

  9. 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化

    C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...

随机推荐

  1. 【JAVAWEB学习笔记】28_jqueryAjax:json数据结构、jquery的ajax操作和表单校验插件

    Ajax-jqueryAjax 今天内容: 1.json数据结构(重点) 2.jquery的ajax操作(重点) 3.jquery的插件使用   一.json数据结构 1.什么是json JSON(J ...

  2. C语言数组之冒泡排序+折半查找法(二分查找)

    冒泡排序算法 将相邻的元素进行两两比较,大的向后"冒", 小的向前"赶". 口诀: N个数字来排队,两两比较小靠前 外层循环N-1(控制需要比较的轮数). 内层 ...

  3. [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?

    在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不 ...

  4. 自研框架wap.js实践

    示例 使用分为3个步骤: 1, 配置模板渲染中心,方便别人可以看到你的模板渲染,请求是什么关系,复杂度怎样 2, 配置事件分发中心  方便观察事件分发,事件复杂度 3,写对应的请求方法.渲染方法.   ...

  5. 数据库MySQL纯净卸载

    有些人在安装MySQL后,卸载后再次安装时,一直安装不上去,到最后不得不重装系统来安装MySQL.这里教大家如何将MySQL卸载干净,不影响下次安装. 卸载过程 1.停止mysql服务 2.进行卸载 ...

  6. 在ie下,a标签包被img的时候,为什么有个蓝色的边线

    效果像下图这样 那是由于<img>在ie下有默认边框,只要清除边框就可以了,在style中定义 img{ border:none } 显示效果就变成下面这样了 完!

  7. 编写一个简单的Web Server

    编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...

  8. 《Python编程从入门到实践》_第五章_if语句

    条件测试 每条if语句的核心都是一个值为Ture或False的表达式,这种表达式被称为为条件测试.Python根据条件测试的值为Ture还是False来决定是否执行if语句中的代码.如果条件测试的值为 ...

  9. vue-router路由参数刷新消失的问题

    场景:vue-router实现的单页应用,登录页调用登录接口后,服务器返回用户信息,然后通过router.push({name: 'index', params: res.data})传给主页组件,并 ...

  10. textarea的中文输入判断与搜狗输入法的特殊行为

    虽然要讲解的知识点是通用的,但是还是要介绍下我的应用场景和测试环境. 0.1 应用场景和测试环境 我的应用是一块使用Html Canvas开发的黑板,在黑板上实现简单的文字编辑功能. 操作系统:win ...