原文:一个sql的优化

目的:为了查询某天某个服务器上的登录id的个数

 
刚开始编写的sql:
select count(a.mac) logusers from Log_MacLogin_All a  
              where isMoNi != 1 
                       and loginTime <= '2015-02-01 23:59:59' and loginTime >= '2015-02-01 00:00:00'
                       and a.mac in (select mac from Inst_User_Mac b
                                                            where doTime <= '2015-01-30 23:59:59' 
                                                                    and doTime >= '2015-01-30 00:00:00   and serverKey='p1s1' );
 执行时间为:33s
对于这个sql,首先的优化点在于"in",因为测试发现in条件里面的数据差不多将近万以上的数据..
 
第一次优化:把in改为exists后,效率有一点的提升
select count(mac) logusers from Log_MacLogin_All a  
              where isMoNi != 1 
                       and loginTime <= '2015-02-01 23:59:59' and loginTime >= '2015-02-01 00:00:00'
                       and exists (select mac from Inst_User_Mac b
                                                            where doTime <= '2015-01-30 23:59:59' 
                                                                    and doTime >= '2015-01-30 00:00:00   and serverKey='p1s1'
                                                                    and a.mac = b.mac );
执行时间为:26s
 
第二次优化:在网上查了下,有的说用join会快一些。把exists改为join试试
select count(a.mac) logusers from Log_MacLogin_All   a   inner join 
(select mac from Inst_User_Mac   where doTime <= '2015-01-30 23:59:59' 
                       and doTime >= '2015-01-30 00:00:00   and serverKey='p1s1'  )    b  
                        on a.mac = b.mac 
       where a.isMoNi != 1 
                       and a.loginTime <= '2015-02-01 23:59:59' and a.loginTime >= '2015-02-01 00:00:00';
执行时间为2.6s,性能有了明显的提高啊
 
第三次优化:把>= <= 改为between and 这样会减少把数据查出来后的计算操作
select count(a.mac) logusers from Log_MacLogin_All   a   inner join 
(select mac from Inst_User_Mac   where doTime between  '2015-01-30 00:00:00  
                       and  '2015-01-30 23:59:59'  and serverKey='p1s1'  )    b  
                        on a.mac = b.mac 
       where a.isMoNi != 1 
                       and a.loginTime between  '2015-02-01 00:00:00'  and '2015-02-01 23:59:59';
执行时间为2.4s,提升了0.2s
 
第四次优化:假如要查某一天的数据不如直接date_format();
select count(a.mac) logusers from Log_MacLogin_All   a   inner join 

(select mac from Inst_User_Mac   where DATE_FORMAT(doTime,'%Y%m%d')='20150130' and serverKey='p1s1'  )    b  

                        on a.mac = b.mac 

       where a.isMoNi != 1  and  DATE_FORMAT(a.loginTime,'%Y%m%d') = '20150201';
执行时间为2.36s,又提升了一点点..

一个sql的优化的更多相关文章

  1. 一个 Sql语句优化的问题- STATISTICS 统计信息

    前段时间,同事遇到一个 Sql语句的问题,一个列表分页功能响应在30 s以上,看数据库里面的数据条数,数据量也不大,相关字段的一些索引也都有,可就是慢.于是找出具体的sql 语句出来分析,分页功能主要 ...

  2. 关于一个sql的优化分析

    应用这边新上线了一个查询,正在跑,让我看下状态以及分析下能不能再快点. 如下sql: SELECT x.order_no , order_date+7/24 AS order_date, addres ...

  3. SQL性能优化案例分析

    这段时间做一个SQL性能优化的案例分析, 整理了一下过往的案例,发现一个比较有意思的,拿出来给大家分享. 这个项目是我在项目开展2期的时候才加入的, 之前一期是个金融内部信息门户, 里面有个功能是收集 ...

  4. SQL Server优化技巧——如何避免查询条件OR引起的性能问题

    之前写过一篇博客"SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析",里面介绍了OR可能会引起全表扫描或索引扫描的各种案例,以及如何优化查询条件中含有OR的SQL语句的 ...

  5. SQL Server优化技巧——如何避免查询条件OR引起的性能问题

    原文:SQL Server优化技巧--如何避免查询条件OR引起的性能问题 之前写过一篇博客"SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析",里面介绍了OR可能会引起 ...

  6. Oracle数据库该如何着手优化一个SQL

    这是个终极问题,因为优化本身的复杂性实在是难以总结的,很多时候优化的方法并不是用到了什么高深莫测的技术,而只是一个思想意识层面的差异,而这些都很可能连带导致性能表现上的巨大差异. 所以有时候我们应该先 ...

  7. oracle性能优化(项目中的一个sql优化的简单记录)

    在项目中,写的sql主要以查询为主,但是数据量一大,就会突出sql性能优化的重要性.其实在数据量2000W以内,可以考虑索引,但超过2000W了,就要考虑分库分表这些了.本文主要记录在实际项目中,一个 ...

  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. 【原创】poj ----- 3009 curling 2 解题报告

    题目地址: http://poj.org/problem?id=3009 题目内容: Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Tot ...

  2. Oracle SQL Lesson (11) - 创建其他数据库对象(试图/序列/索引/同义词)

    schema(模式)一个用户下一组对象的集合,一般与用户名一致. 视图 CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[, alias].. ...

  3. doc-remote-debugging.html

    https://studio.zerobrane.com/doc-remote-debugging.html

  4. 【Android 应用开发】 FastJson 使用具体解释

    博客地址 :http://blog.csdn.net/shulianghan/article/details/41011605 fastjson 源代码地址 : -- GitHub : https:/ ...

  5. CSS+DIV+HTML(一)--HTML总结

    一.定义 HTML(Hyper Text Markup Language),标记语言. 二.主要内容: HTML元素分为三类:块级标签.内联标签.可变标签.差别在于: 块级元素:在默认情况下会换行显示 ...

  6. Codeforces Round #264 (Div. 2) C Gargari and Bishops 【暴力】

    称号: 意甲冠军:给定一个矩阵,每格我们有一个数,然后把两个大象,我希望能够吃的对角线上的所有数字.我问两个最大的大象可以吃值. 分析:这种想法是暴力的主题,计算出每一格放象的话能得到多少钱,然后求出 ...

  7. onsubmit事件

    var oForm = document.getElementById("form1"); oForm.onsubmit = function(){   alert("你 ...

  8. WPF中两条路径渐变的探讨

    原文:WPF中两条路径渐变的探讨 我们在WPF中,偶尔也会涉及到两条路径作一些“路径渐变 ”.先看看比较简单的情形:如下图(关键点用红色圆点加以标识):(图1) 上面图1中的第1幅图可以说是最简单的路 ...

  9. Java基金会——JUnit

    JUnit 測试的重要性毋庸质疑.但怎样使測试更加准确和全面.而且独立于项目之外而且避免硬编码,JUnit给了我们一个非常好的解决方式. 能够说JUnit是为单元測试而生的,一个Java语言的单元測试 ...

  10. Singleton模式线程相关的(C\C++)

    这种需求的最新发展. 我需要一个静态类,无论地方,我可以在线程中调用它public功能对应的功能已经完成. 这个静态类会调用我初始化给它的一个指针,这个指针是与线程一一相应的: 准确来说这样的模式应该 ...