如何编写高效的SQL
编写高效的sql可以给用户带来好的体验,需要开发这没有意识到这一点因为他们不关心也不知道怎么做。高效的sql可以给用户节省很多时间,这样就不需要dba来找上门,也不需要搭建RCA和性能调优。
性能不好的SQL有需要原因,其中之一是:全表扫描
什么时候应该用全表扫描
并不是说用全表扫描的方法来从表中获取数据是糟糕的方式,优化器选择全表扫描的方式而不选择索引的方式基于以下几点:
a)如果数据量特别大,使用索引的方式不一定会比全表扫描快;
b)如果查询表中所有的行(没有where)则优化器会选择全表扫描;
c)如果从表中检索大量数据,索引可能没有任何优势。
d)如果优化器没有准确的数据分布信息,它可能会选择错误的索引或根本没有索引;
e)如果where语句中的子查询包含的某些列,则可能导致索引不可用。
什么时候应该用索引
优化器选择索引扫描而不选择全表查询的情况基于以下几点:
a)where语句中的列与现有索引正好匹配;
b)有DISTINCT,UNION 和ORDER BY 则会用索引查询;
c)有主键与外键约束则也会用索引;
d)尽量避免使用order by 。
WHERE语句的陷阱
因为不好的where语句,可能导致扫描不走索引:
a)在WHERE子句中使用列,它与索引中的列顺序不匹配;
b)比较同一表中的列;
c)选择的列是low-selectivity indexes;
d)在其中一列使用了count然后让他与一个常量比较;
e)在其中一列使用function然后让他与一个常量比较;
f)使用了like
g)与null 做比较
h)使用了not
i)使用了转换值
j)使用了in
要编写好的SQL,请避免上面提到的陷阱并采纳以下建议:
a)范围的话尽量使用between and
b)如果外部查询有附件条件使用exists或not exists
c)如果没办法避免order by 则尽量使用索引列
Examples:
黄金法则
如果代码中包含算数表达式,尽量把他转换成求值的结果;
在列中避免使用functions
当你知道一组值的分布时候,尽量别使用<>而是把他转换为>和<的表达式;
把or 转换为in;
like 要比substring性能好;
尽量把union用or替代;
使用CASE来过滤最终的select list
where语句必须按照这些列在索引中出现的顺序使用;
使用子查询来代替join可以提高一些分组连接的性能;
使用distinct来代替group by;
尽量不在语句中使用distinct 和order by 除非你真的需要...
尽量不用outer join
子查询中的表如果可以通过from 与主表连接,则尽量别使用子查询;
所有的表或视图都应该有key field
尽量使用union all 来代替union;
- 我的公众号:

如何编写高效的SQL的更多相关文章
- MySql如何编写高效的SQL
最近应团队要求,研究整理了下,mysql相关的优化,有些是根据实际java项目中碰到的情况经验之谈.欢迎讨论~ SQL 语言是一种强大而且灵活的语言,在使用 SQL 语言来执行某个关系查询的时候,用户 ...
- 编写高效SQL最佳实践
编写高效 SQL 语句的最佳实践 秦玮, 高级软件工程师, IBM 王广成, 软件工程师, IBM 王韵婷, 高级软件工程师, IBM 简介: 本文列举了一些在编写 SQL 查询语句时可能导致 DB2 ...
- 编写高效SQL语句(转)
转至http://blog.csdn.net/u012150457/article/details/41846299 一.编写高效SQL语句 1) 选择最有效的表名顺序(仅适用于RBO模式) ORAC ...
- 08 高效的SQL
编写高效 SQL 需要以下知识 有关所查询内容的物理组织的知识 数据库能做什么的知识, 例如: 如果你不知道跳跃扫描索引及其用途, 那么你可能会看着模式说”索引丢了” SQL 所有错综复杂的知识 对目 ...
- Oracle如何写出高效的SQL
转载:http://www.blogjava.net/ashutc/archive/2009/07/19/277215.html 1.选择最有效率的表明顺序(只在基于规则的优化器中有效) Oracle ...
- 编写高效的CSS选择符(节选)
最右边优先 css选择符是从右向左进行匹配的. 样式系统从最右边的选择符开始向左匹配规则.只要当前的选择符的左边还有其他选择符,样式系统就会继续向左移动,直到找到和匹配的元素,或者因为不匹配而退出. ...
- js学习笔记-编写高效、规范的js代码-Tom
编写高效.规范的js代码: 1.变量命名空间问题,尽量使用局部变量,防止命名冲突(污染作用域中的全局变量):全局空间命名的变量可以在对应的文档域任意位置中使用window调用. 2.尽量使用单var定 ...
- 编写高效的Android代码
编写高效的Android代码 毫无疑问,基于Android平台的设备一定是嵌入式设备.现代的手持设备不仅仅是一部电话那么简单,它还是一个小型的手持电脑,但是,即使是最快的最高端的手持设备也远远比不上一 ...
- 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化
C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...
随机推荐
- java 操作 redis
1.Java 使用 Redis 只需要下载一个jar包即可 地址:http://maven.outofmemory.cn/redis.clients/jedis/2.5.2/ 工程
- 第 18 章 高可用设计之 MySQL 监控
前言: 一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑.一个系统,无论如何设计如何维护,都无法完全避免出 ...
- DOM4J介绍与代码示例(2)-XPath 详解
XPath 详解,总结 XPath简介 XPath是W3C的一个标准.它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计.目前有XPath1.0和 XPath2.0两个版本.其 ...
- java虚拟机学习-深入理解JVM(1)
1 Java技术与Java虚拟机 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言.Java类文件格式.Java虚拟机和Java应 ...
- laravel实现多数据库连接配置
只需三步,便可实现. 第一步,在.env文件中配置 DB_HOST=localhost DB_DATABASE=test DB_USERNAME=root DB_PASSWORD=root DB_HO ...
- Centos7 最小系统安装Redis
最近想写一个调度系统,一顿查资料之后决定用Django+Celery+Redis实现,前面两个都已经有了,就缺一个Redis,所以准备安装一个Redis 获取Centos7并配置网络 获取Centos ...
- python+requests+unittest API接口测试
黑熊再网上查找了下接口测试相关的资料,大都重点是以数据驱动的形式,见用例维护在文本或表格中,而没有说明怎么样去生成想要的用例, 问题: 测试接口时,比如参数a,b,c,我要先测a参数,有(不传,为空, ...
- [github项目]基于百度地图二次开发实现的车辆监管(包含车辆定位、车辆图片和方向控制,电子围栏,图形绘制等功能)前端实现(不包含后端实现)
前言:基于百度地图javascript版本开发,百度地图中所用的key已承诺仅用于测试,不用于商业用途 注:本文所有代码可以到github上进行下载,github地址:http://map.eguid ...
- scrapy调试时出现 ImportError: No module named win32api
windows下利用scrapy(python2.7)写爬虫,运行 scrapy crawl dmoz 命令时提示:exceptions.ImportError: No module named wi ...
- 由 “无法使用从远程表选择的 lob 定位符” 错误而引导出来的一系列问题解决方案
周一上班遇到一个数据加工问题:无法使用从远程表选择的 lob 定位符,由于数据源表不是自己的,不能对源数据做修改,于是我打起了存储过程的主意 我们公司的存过是分三步走,第一层是同步源数据,第二层是对一 ...