记录一个sql优化后大大提高查询效率的情形

众所周知,sql写得怎么样,对于查询效率的影响是颇大的。下面看一个比较普通的查询:

假设一张表有event_date和event_time2个字段分别表示日期和时间,现在直接给你一个时间字符串,这个时间字符串是“日期+时间”的组合,现在需要按时间范围过滤出一部分数据。如果你不转弯的话,很有可能你会按照惯性思维使用concat(event_date, event_time)连接函数,如:

SELECT A, MAX(B) AS B,SUBSTR(CONCAT(event_date, event_time),1,12)AS tran_time
       FROM tablename
 WHERE SUBSTR(CONCAT(event_date, event_time),1,12) >= :start_time
 AND SUBSTR(CONCAT(event_date, event_time),1,12) < :end_time
     AND A = :A
        GROUP BY A,tran_time
        ORDER BY A,tran_time ASC

start_time和end_time是传递过来的由“日期+时间”组合成的字符串。

这是比较容易想到的传统思维,但这种sql语句的查询效率老低了。差不多查一次需要4.5s+, 因为不仅仅需要用到max函数,还需按SUBSTR(CONCAT(event_date, event_time),1,12) 这个计算出来的字段group by,最主要的是在where语句里,对2个时间的字段需要进行多重函数运算后看看那些记录符合你所规定的时间范围~~ 这样,在不知不觉中,造成了全表扫描,效率极低,特别是在表中数据量比较大的时候。

我们已经知道,如果一张表是数据量比较大的表,并且一般都用与于查询时,索引的使用会给我们带来极大的性能优化。考虑到使用索引,我们应该尽量避免where语句里的字段不进行函数作用(因为即使你对where下的字段建立了索引,但如果你对他们进行了函数运算,索引是失效的),所以我们考虑把它们尽量独立开来。

基于上述思想,改正如下:

先对A, evnet_date和event_time三个字段建立索引。

SELECT A, MAX(B) AS B,SUBSTR(CONCAT(event_date, event_time),1,12)AS tran_time
       FROM tablename
 WHERE event_date >= :start_date AND event_time >= :start_time
       AND event_date <= :end_date AND event_time < :end_time
     AND A = :A
        GROUP BY A,tran_time
        ORDER BY A,tran_time ASC

可以看出我们把event_date和event_time的起止时间都“拆”开来了,所以只需在传过来的起止时间字符串上截取响应的日期和时间字符串给sql语句即可。

测试检查发现,2句sql查询出的结果是一致的,说明他们是等效的。

改正之后,发现效率提升至0.05s左右,性能得到极大提升!!!

这句优化后的sql语句是突破了sql语句字段去适应外部传过来的时间字符串,而是从sql优化的角度看,让外部的条件去适应sql语句的查询,这种思想我之前很少有,也算是一种思维的突破了!

时间: 2025-01-11 19:26:45

记录一个sql优化后大大提高查询效率的情形的相关文章

SQL 百万级数据提高查询速度的方法

SQL 百万级数据提高查询速度的方法 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引.3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

在一个千万级的数据库查寻中,如何提高查询效率?

在一个千万级的数据库查寻中,如何提高查询效率? 1)数据库设计方面:  a.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. b.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0

oracle提高查询效率的34条方法

注:本文来源:远方的守望者  <oracle提高查询效率的34条方法> oracle提高查询效率的34条方法 1.选择最有效率的表名顺序 (只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是

如何测试sql语句性能,提高执行效率

有时候我们经常为我们的sql语句执行效率低下发愁,反复优化后,可还是得不到提高 那么你就用这条语句找出你sql到底是在哪里慢了 示例: SET STATISTICS io ON        SET STATISTICS time ON        go         ---你要测试的sql语句         select top 100 * from TBL_Cot_RecStaticList        go        SET STATISTICS profile OFF    

优化TCP,提高HTTP效率

1.一次网络访问的流程 http://www.taobao.com:80/market/66/meizhuang.php?spm=1.7274553.1997517397.2.WtZPYg&acm=20140506001.1003.2.72323&uuid=1LmYAFs6&scm=1003.2.20140506001.OTHER_1400654077067_72323&pos=0 第一.浏览器解析主机名:http://www.taobao.com 第二.根据主机名获得IP

数据库建索引提高查询效率

1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有3个未索引的表t1.t2.t3,分别只包含列c1.c2.c3,每个表分别含有1000行数据组成,指为1-1000的数值,查找对应值相等行的查询如下所示. SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3 此查询结果应该为1000行,每行包含3个相

es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

面试题es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?面试官心理分析这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的.很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s,坑爹了.第一次搜索的时候,是 5~10s,后面反而就快了,可能就几百毫秒.你就很懵,每个用户第一次访问都会比较慢,比较卡么?所以你要是没玩儿过 es,或者就是自己玩玩儿 demo,被问到这个问题容易懵逼,显示出你对

Lucene4.6查询时完全跳过打分,提高查询效率的实现方式

由于索引的文件量比较大,而且应用中不需要对文档进行打分,只需要查询出所有满足条件的文档.所以需要跳过打分来提高查询效率.一开始想用ConstantScoreQuery,但是测试发现这个类虽然让所有返回的文档打分都为1.0并没有提高查询效率,因此查资料发现可以用Filter实现跳过打分,其中又以 FieldCacheTermsFilter为最佳,其缓存机制给查询的速度提升极为明显.后面有空的时候给出完整实现,这两天略忙. 核心代码: Query query = new TermQuery(new

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

在项目中,写的sql主要以查询为主,但是数据量一大,就会突出sql性能优化的重要性.其实在数据量2000W以内,可以考虑索引,但超过2000W了,就要考虑分库分表这些了.本文主要记录在实际项目中,一个需要查询很慢的sql的优化过程,如果有更好的方案,请在下面留言交流. 很多文章都有关于sql优化的方法,这里就不一一陈述了.如果有需要可以查看博客:https://blog.csdn.net/linhaiyun_ytdx/article/details/79101122 SELECT T.YHBH,