受同事dd之托,优化一条boss看的报表SQL。dd写复杂疑难SQL无数,如何写出优雅的SQL自有一番心得体会。能将一条7表含inner join,left join并含有关联子查询的、返回结果集3400余条的SQL优化到2s已足以证明功力之深厚。此次也是在她的基础上加以分析,优化,将此过程记录分享。
  1、原始SQL。希望将执行时间缩减到1s以内。

    

    执行计划如下:(执行时间2.063 sec)

    

    摘除红框的where条件执行计划如下:(执行时间0.452 sec)
    
    分析:SQL中的where条件为不相关子查询。然后使用not in

    

  分析1:
  not in 在这里形成了笛卡尔积。形成3418*252次判断。如果改成in则会走索引。执行时间0.2s
  于是灵光一现。想到:
    不加where条件返回的数据集 - in 返回的数据集 =  原SQL中返回的数据集
  两个执行时间为0.2s 的SQL相减 得到执行时间为 0 。真diao!
 
  分析2:
  冥冥之中自由一股力量引领我将where条件中的表和大表做条件关联。
  以避免这种毫无关系的笛卡尔积,同时也实现了江湖人人歌颂的小结果集驱动(红框中STRAIGHT_JOIN强制指定驱动表顺序)。
  于是乎另一种写法闪亮登场。执行时间:0.248 sec . 真屌!

    

备注(废话):正常来说,在一个结果集后面加where条件不会比没有where条件时糟糕。理由如下:

第一种情况:如果该where条件列有索引
1、使用到了索引。
  1、为减少CPU的使用而走的索引。比如对结果集进行排序(分组),最值等。
  2、为减少IO而走的索引。
  
  如果CPU强劲(频率高),排序计算的时间就很快。
  如果IO吞吐能力强(假设产生物理读),CPU处于IO wait的时间就相对少。即便这样关系型数据库中也不建议产生大量的物理读。一来,外存的IO速度与CPU处理之间有不可逾越的鸿沟,同时,同时也防止大量的读将      
  内存池数据(buffer pool data)被swap out出去。
  总结就是:
  待取的数据/实际读出的数据 约接近1越好。体现在执行计划列rows的值接近实际返回的行数(found_rows())。
  
  当然最好的设计模式是1、2兼得。最典型的案例如索引(column1,column2)
  where column1 = ‘value1’ [group|order] by column2类似查询。
 
2、没有使用到索引。
  1、确实不可走。如联合索引的后缀。这由B+Tree索引的数据结构决定。等
  2、优化器认为走索引的代价不如不走索引。通过非聚集索引(也称为二级索引)的指针找表的过程俗称回表(同样有不回表的覆盖索引(Extra列含有use index))。大量的回表不如全表扫。这是大多数能走的索引却  
    不走的原因。这个过程基于数据库内部维护对表的定期采样的数据。统计信息的不准也会导致该走某个索引却没有走。等
 
  如果有索引却没有使用到索引,获取到结果集的时间理论上是略大于没有where条件的。(优化器发现该表有可用的索引,会分析走索引的代价,略微增加了解析时间,除非关联的表异常多,一般可忽略不计)。 
  多数情况我们信任基于成本(CBO)查询优化器(Query Optimizer)。如果不,也可以通过IGNORE,FORCE,USE忽略、强制、建议走索引。
 
第二种情况:如果没有索引
  1.  多了判断是否符合where条件的计算的时间。甚至如果此时CPU使用率异常繁忙,可能会
    因为抢占不到CPU时间导致一条简单的SQL 语句hang住。
    所以如果没有索引 ,有where条件获取到结果集的时间大于没有where条件。(如果远程客户端,假定网络带宽足够大)
 
 
ps:如上备注,均为个人见解。如有不当,还望交流指点。qq:475982055

SQL高度优化的更多相关文章

  1. SQL索引优化

    序言数据库的优化方法有很多种,在应用层来说,主要是基于索引的优化.本次秘笈根据实际的工作经验,在研发原来已有的方法的基础上,进行了一些扩充,总结了基于索引的SQL语句优化的降龙十八掌,希望有一天你能用 ...

  2. 数据库 基于索引的SQL语句优化之降龙十八掌(转)

    一篇挺不错的关于SQL语句优化的文章,因不知原始出处,故未作引用说明! 1 前言      客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急 ...

  3. mysql优化 | 存储引擎,建表,索引,sql的优化建议

    个人对于选择存储引擎,建表,建索引,sql优化的一些总结,给读者提供一些参考意见 推荐访问我的个人网站,排版更好看: https://chenmingyu.top/mysql-optimize/ 存储 ...

  4. MySQL常用SQL语句优化

    推荐阅读这篇博文,索引说的非常详细到位:http://blog.linezing.com/?p=798#nav-3-2 在数据库日常维护中,最常做的事情就是SQL语句优化,因为这个才是影响性能的最主要 ...

  5. SQL Server优化的方法

    SQL Server优化的方法<一>   查询速度慢的原因很多,常见如下几种:   1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)   2.I/O吞吐量小,形成了 ...

  6. 关于索引的sql语句优化之降龙十八掌

    1 前言       客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急剧下降,小型机idle所剩无几,应用服务器断连.超时,严重影响业务的正 ...

  7. php面试专题---MySQL常用SQL语句优化

    php面试专题---MySQL常用SQL语句优化 一.总结 一句话总结: 原理,万变不离其宗:其实SQL语句优化的过程中,无非就是对mysql的执行计划理解,以及B+树索引的理解,其实只要我们理解执行 ...

  8. SQL Server SQL性能优化之--通过拆分SQL提高执行效率,以及性能高低背后的原因

    复杂SQL拆分优化 拆分SQL是性能优化一种非常有效的方法之一, 具体就是将复杂的SQL按照一定的逻辑逐步分解成简单的SQL,借助临时表,最后执行一个等价的逻辑,已达到高效执行的目的 一直想写一遍通过 ...

  9. 深入浅出数据仓库中SQL性能优化之Hive篇

    转自:http://www.csdn.net/article/2015-01-13/2823530 一个Hive查询生成多个Map Reduce Job,一个Map Reduce Job又有Map,R ...

随机推荐

  1. (015)实现一个函数来检查是否平衡树(keep it up)

    实现一个函数来检查是否平衡树.这个问题而言. 平衡指的是这棵树随意两个叶子结点到根结点的距离之差不大于1. 这个题我们能够採用暴力搜索,找到叶子节点到根节点的最小值和最大值.然后他们的差假设大于1就不 ...

  2. glibc内存管理方式

    程序员接触的内存空间和系统接触的物理内存空间是有所区别的.对于一般进程来讲,他面对的是一个线性虚拟内存空间:地址从0到最大值.每一个进程面对的虚拟内存空间都是一样的,都享有全部的内存地址.虚拟内存空间 ...

  3. C#开发奇技淫巧一:调试windows系统服务

    原文:C#开发奇技淫巧一:调试windows系统服务 windows系统服务不能直接运行,只能在安装完服务之后启动.暂停.继续.停止服务,导致服务的调试不能使用一般的断点调试. 要调试系统服务,可以采 ...

  4. 教你干掉win10全家桶

    原文: 教你干掉win10全家桶 这些并不好用的自带应用例如:groove音乐,相片,股票……一直占据着我们的默认应用.如果它们是一直静静的躺在那里还好,最多不用就是了.当我们想要浏览图片或者看视频的 ...

  5. centos 6.5 搭建ftp 服务器(vsftpd的配置文件说明)

    0x00 如何快速的搭建简易的资源发布站 开启简易的python http服务器 1 2 cd /home/your_path python -m SimpleHTTPServer 8000 开启防火 ...

  6. Win10《芒果TV》更新v3.6.0秋收版:新增追剧磁贴、记忆续播、跳转列表

    热血青春,唱响革命战歌,<秋收起义>正在芒果TV热播,Win10版<芒果TV>更新v3.6.0秋收版,新增追剧磁贴.记忆续播.跳转列表. Win10版<芒果TV>V ...

  7. 【Windows10 IoT开发系列】“Hello,World!”指导

    原文:[Windows10 IoT开发系列]"Hello,World!"指导 本文主要是介绍使用C#来开发一个可以运行在Raspberry Pi2上的一个基本项目. ​1.在启动V ...

  8. Windows10 使用Virtual Box一启动虚拟机就蓝屏(错误代码SYSTEM_SERVICE_EXCEPTION)解决方案

    原文:Windows10 使用Virtual Box一启动虚拟机就蓝屏(错误代码SYSTEM_SERVICE_EXCEPTION)解决方案 一打开虚拟机电脑就立马蓝屏重启,新建虚拟机也没用,然后就开始 ...

  9. 快速搭建多线程Windows服务解决方案

    一.引言 在软件开发过程中windows服务有的时候非常有用,用于同步数据,发送邮件,宿主WF引擎服务等,但是快速搭建一个好用多线程进行多任务处理的程序往往是一个项目必须考虑的问题.自己在项目中也经常 ...

  10. Delphi中TResourceStream流使用

    Resource可以是任意文件(图像.声音.office都可以),直接打包到编译的exe文件中,调用也非常方便 打开一个新的或已有的delphi工程 1.先在 Project->resource ...