原文:一个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. javascript推断的浏览器类型

    <script> window["MzBrowser"]={};(function() { if(MzBrowser.platform) return; var ua ...

  2. JavaScript模式读书笔记 文章3章 文字和构造

    1.对象字面量     -1.Javascript中所创建的自己定义对象在任务时候都是可变的.能够从一个空对象開始,依据须要添加函数.对象字面量模式能够使我们在创建对象的时候向其加入函数.       ...

  3. 在js中做数字字符串加0补位,效率分析

    分类: Jquery/YUI/ExtJs 2010-08-30 11:27 2700人阅读 评论(0) 收藏 举报 functiondate算法语言c 通常遇到的一个问题是日期的“1976-02-03 ...

  4. web网站架构

    浅谈web网站架构演变过程   前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变.   该系统具备的功能:   用户模块:用户注册和管理 商品模块:商品展示和管 ...

  5. OpenStack_Swift源代码分析——Ring基本原理及一致性Hash算法

    1.Ring的基本概念 Ring是swfit中最重要的组件.用于记录存储对象与物理位置之间的映射关系,当用户须要对Account.Container.Object操作时,就须要查询相应的Ring文件( ...

  6. C/C++大型项目错误管理

    在C/C++大型项目中,错误管理在项目中起着举足轻重的作用,以我自己的项目经验以及观摩其它项目,错误管理对项目框架以及开发效率有着非常大的影响.对于错误管理的认识大致分为三类: 刚刚開始敲代码的新手, ...

  7. js+html+css简单的互动功能页面(2015知道几乎尖笔试题)http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html?from=y1.7-1.2

    js+html+css实现简单页面交互功能(2015知乎前端笔试题) http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html? from=y1.7-1. ...

  8. DiskFileUpload类

    1.2.2 DiskFileUpload类 DiskFileUpload类是Apache文件上传组件的核心类,应用程序开发者通过这个类来与Apache文件上传组件进行交互.以下介绍DiskFileUp ...

  9. 安装gcc 3.4

    安装   gcc 3.4 f**k,不是为了编译0.11内核.我才懒得鸟3.4的版本号 源代码编译被我实践--"不归路",各种报错,我起码不止是了4个版本号的gcc,各种不兼容.各 ...

  10. git bash 出现vim的时候怎么退出

    如果是输出状态,首先Esc退出输入状态,然后Shift+;,再输入q!或wq!(不保存改动,wq!是保存文件的写入修改)退出