sql 查询 between and 和 >= <= 比较

  好久没有更新博客了,积累了很多问题没有得到解决,自己也在纠结有些东西需不需要花时间研究一下,认真想了想,不管怎么样,不能停止更新博客,继续保持一周至少一篇的习惯,不能放弃。

  今天说的问题比较简单,就是在相同条件下where子句中使用between and 和>= <=哪个效率更高?其实个人觉得他们两个的效率基本一样,但是between and 中间有一步会转义成 >= <= ,如果硬要说谁更快,那肯定是直接用>= <= 会好一些,实际上那点转义的消耗基本上可以忽略不计。

  注意:between and 包括起始值和终点值,等同于>= and <= .

转载于:https://www.cnblogs.com/52XF/p/4050311.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
具体做法如下: 1. 对where条件中的字段建立索引:针对b2.area_code_、b.billType、b.IS_DELETE_、b.CRT_TIME_、b.Duration、b.CallerNum等字段建立相应的索引,可以提高查询效率。 2. 避免使用子查询:将子查询改写成join操作,可以提高查询速度。例如: ``` SELECT b.CallerNum, b.Duration duration, min(b.CRT_TIME_) abnormalTime, count(b.CallerNum) abnormalCallNumber, count(b.CallerNum) abnormalCallTotal FROM basebill b LEFT JOIN billdetails b2 ON b.base_bill_id = b2.base_bill_id LEFT JOIN (SELECT CallerNum, COUNT(*) AS cnt FROM basebill WHERE IS_DELETE_ = 0 AND CRT_TIME_ >= '2023-06-06 13:00:00' AND CRT_TIME_ <= '2023-06-06 15:00:00' GROUP BY CallerNum HAVING COUNT(*) >= 5) AS t1 ON b.CallerNum = t1.CallerNum LEFT JOIN (SELECT CallerNum, COUNT(*) AS cnt FROM basebill WHERE IS_DELETE_ = 0 AND CRT_TIME_ >= '2023-06-06 13:00:00' AND CRT_TIME_ <= '2023-06-06 15:00:00' GROUP BY CallerNum HAVING COUNT(*) >= 10) AS t2 ON b.CallerNum = t2.CallerNum WHERE b2.area_code_ != 86 AND b.billType = 1 AND b.IS_DELETE_ = 0 AND b.CRT_TIME_ >= '2023-06-06 13:00:00' AND b.CRT_TIME_ <= '2023-06-06 15:00:00' AND (b.Duration >= 900 OR t1.CallerNum IS NOT NULL OR t2.CallerNum IS NOT NULL) GROUP BY b.CallerNum ``` 3. 避免重复查询:在where条件和select语句中都有重复查询的情况,可以将重复查询的部分提取出来,减少查询次数。例如: ``` SELECT b.CallerNum, b.Duration duration, min(b.CRT_TIME_) abnormalTime, count(b.CallerNum) abnormalCallNumber, count(b.CallerNum) abnormalCallTotal FROM basebill b LEFT JOIN billdetails b2 ON b.base_bill_id = b2.base_bill_id LEFT JOIN (SELECT CallerNum, COUNT(*) AS cnt FROM basebill WHERE IS_DELETE_ = 0 AND CRT_TIME_ >= '2023-06-06 13:00:00' AND CRT_TIME_ <= '2023-06-06 15:00:00' GROUP BY CallerNum HAVING COUNT(*) >= 5) AS t1 ON b.CallerNum = t1.CallerNum LEFT JOIN (SELECT CallerNum, COUNT(*) AS cnt FROM basebill WHERE IS_DELETE_ = 0 AND CRT_TIME_ >= '2023-06-06 13:00:00' AND CRT_TIME_ <= '2023-06-06 15:00:00' GROUP BY CallerNum HAVING COUNT(*) >= 10) AS t2 ON b.CallerNum = t2.CallerNum WHERE b2.area_code_ != 86 AND b.billType = 1 AND b.IS_DELETE_ = 0 AND b.CRT_TIME_ BETWEEN '2023-06-06 13:00:00' AND '2023-06-06 15:00:00' AND (b.Duration >= 900 OR t1.CallerNum IS NOT NULL OR t2.CallerNum IS NOT NULL) GROUP BY b.CallerNum, b.Duration, abnormalTime ``` 4. 分批查询:将查询时间段分成多个小段,避免一次查询过多数据,导致查询速度变慢。 5. 对于大表使用分区表:如果表中数据量较大,可以将表进行分区,以提高查询效率。 6. 定期清理无用数据:定期清理已经无用的数据,可以减少查询时的数据量,提高查询速度。 综上所述,以上优化方案可以针对不同的情况进行选择,以提高SQL语句的查询速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值