SQL关于Date类型时间段查询优化(时间跨度稍长)(记一次自己工作开发中遇到的SQL优化经验)

article/2025/9/18 7:00:13

前言

以下用于SQL查询的数据均为测试环境的数据,关键数据都已打码。

背景

我们的日常开放中都会遇到 查询某个时间段的数据,像这样:

select * from test(表名) where time BETWEEN '2022-08-20 00:00:00' AND '2022-09-19 00:00:00'

但如果时间段跨度稍微长一些呢?以上我作为例子的SQL跨度就跨了1个月


正文开始

假设我有这么一张运单表,它有一个时间字段:route_time,现在我需要查询这张表某个日期段间(并且route_state=80)的数据,时间的跨度需要1个月,每条运单 只算一条(分组)


我们先看看这张表有多少数据:

	SELECT count(*) FROM waybill_route;

在这里插入图片描述

在不加任何索引的情况下查询:

SELECT waybill_no FROM waybill_route WHERE  route_state = 80 and route_time BETWEEN '2022-08-20 00:00:00' AND '2022-09-19 00:00:00' GROUP BY waybill_no;
EXPLAIN SELECT waybill_no FROM waybill_route WHERE  route_time BETWEEN '2022-08-20 00:00:00' AND '2022-09-19 00:00:00' ;

加上 EXPLAIN 关键字,我们看一下它的执行结果:
在这里插入图片描述

在这里插入图片描述
type 的那一栏目为 All, 这一次的查询走了全表的扫描,从3994458行数据中找出了74231条数据,但执行时间很长,多次执行取平均值 在4.9秒左右,这显然不是我们理想的结果。


我们为 route_time 、route_state 这个l两个字段加上一个普通索引过后:

SELECT waybill_no FROM waybill_route WHERE  route_time BETWEEN '2022-08-20 00:00:00' AND '2022-09-19 00:00:00' ;
EXPLAIN SELECT waybill_no FROM waybill_route WHERE  route_time BETWEEN '2022-08-20 00:00:00' AND '2022-09-19 00:00:00' ;

在这里插入图片描述

在这里插入图片描述

type 的那一栏目为 All, 这一次的查询也走了全表的扫描,从3994458行数据中找出了74231条数据,执行时间多次执行取平均值过后,大约在4.5秒左右,减少了0.5秒,加了索引查询速度也不是很明显

filtered 表示通过查询条件获取的最终记录行数占通过type字段指明的搜索方式搜索出来的记录行数的百分比。

我们再关注Extra这一栏目的信息:

Using temporary: 创建了一个内部临时表

Using filesort: 对查询的数据进行了排序,没有走索引

整理思路

显然最终的结果仍然不在我们能接收的范围之内,首先 type=All 我们需要想想其它的思路。

在这里插入图片描述
我们是不是能找出 时间大于我们时间段开始时间的数据的 最小id呢?

SELECT MIN(id) FROM waybill_route WHERE route_time>'2022-08-20 00:00:00';

然后再把它作为一个条件之一加到我们SQL里,最终的优化的SQL:

SELECT
waybill_no
FROMwaybill_route 
WHEREid > ( SELECT MIN( id ) FROM waybill_route WHERE route_time > '2022-08-20 00:00:00' ) AND route_time BETWEEN '2022-08-20 00:00:00' AND '2022-09-19 00:00:00' GROUP BY waybill_no;
EXPLAIN SELECT
waybill_no
FROMwaybill_route 
WHEREid > ( SELECT MIN( id ) FROM waybill_route WHERE route_time > '2022-08-20 00:00:00' ) AND route_time BETWEEN '2022-08-20 00:00:00' AND '2022-09-19 00:00:00' GROUP BY waybill_no;

在这里插入图片描述

在这里插入图片描述
type 的那一栏目为 range,执行时间多次执行取平均值过后,大约在 3.7 秒左右,相比于上次快了接近 1 秒,但是我们可以明显的看到索引我们走到了主键索引

最优到最差分别为:system > const > eq_ref > ref > range > index > ALL一般来说,得保证查询达到range级别,最好达到ref


http://chatgpt.dhexx.cn/article/AWlSTOXr.shtml

相关文章

MySql基础知识总结(SQL优化篇)

🍅 作者简介:CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪 🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师 🍅 关注公众号【哪吒编程】,回复1024&a…

【高级开发必掌握SQL】SQL优化篇

❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主&#x1f3…

SQL优化方案

转载至:http://blog.itpub.net/31555484/viewspace-2565387/ 作者1:惨绿少年 https://www.cnblogs.com/clsn/p/8214048.html 作者2:喜欢拿铁的人 https://zhuanlan.zhihu.com/p/49888088 在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程&am…

慢SQL优化

1、慢查询统计 show VARIABLES like %que% SET GLOBAL slow_query_log on; //开启慢sql统计开关 SET GLOBAL long_query_time 1; //设置超过1秒则 认为是慢sql , 注意此处设置完之后需要重新链接客户端 才可以查看到设置成功 2、优化 索引优化 通过执行计划&…

Oracle数据库SQL优化详解

Oracle数据库SQL优化 1. Oracle SQL优化概述2. Oracle SQL优化详解2.1 Oracle 查询阻塞2.2 Oracle 查询耗时 SQL2.3.Oracle 查看执行计划2.4.Oracle 查看收集统计信息2.5.Oracle 查询优化器 -- 改写查询语句2.6.Oracle 查询优化器 -- 访问路径2.7.Oracle 查询优化器 -- 表连接方…

Mysql sql优化

这里引用深入Mysql实战 为什么要优化 提高资源利用率避免短板效应提高系统吞吐量同时满足更多用户的在线需求 简单来说,优化的目的是为了提高资源的利用率,让资源充分发挥价值。常见场景下,一台服务器有四大资源:cup、内存网络…

sql优化的15个小技巧

最近找了找怎么优化SQL,总结了15个基础技巧 因为最近一直在写sql的原因,所以需要知道sql该怎么优化,怕哪一天线上的接口,出了问题,需要优化,就需要采用改造成本最小的. 先上个导图 1.避免使用 select * 很多时候,我们写sql语句时,直接使用select *&am…

聊聊sql优化的15个小技巧

前言 sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。 如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化sql语句,因为它的…

SQL优化的方法

(1)建立物化视图或尽可能减少多表查询。 (2)以不相干子查询替代相干子查询。 (3)只检索需要的列。 (4)用带in的条件子句等价替换or子句。 (5)经常提交com…

sql优化的N种方法_持续更新

当你访问网站的时候,有的时候会慢的想让你砸电脑,这个时候服务器要背锅了吗? 不,要背锅的不仅仅是服务器,数据库也有很大责任,不负责任的sql开发者更会让你崩溃的.为了提高sql响应速度,还是好好了解下sql的优化吧 sql优化的方式 一:sql性能分析 sql优化首先要对sql的消耗时…

sql优化常用的几种方法:19种最有效的sql优化技巧

我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下: 1、EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。 下面来个简单的示例,标注(1、2、3、4、5)我们要重点关注的数据&#x…

sql优化的15个小技巧(必知五颗星),面试说出七八个就有了

目录 前言 1 避免使用select * 2 用union all代替union 3 小表驱动大表 4 批量操作 5 多用limit 6 in中值太多 7 增量查询 8 高效的分页 9 用连接查询代替子查询 10 join的表不宜过多 11 join时要注意 12 控制索引的数量 13 选择合理的字段类型 14 提升group by的…

MySQL高级篇(SQL优化、索引优化、锁机制、主从复制)

目录 0 存储引擎介绍1 SQL性能分析2 常见通用的JOIN查询SQL执行加载顺序七种JOIN写法 3 索引介绍3.1 索引是什么3.2 索引优劣势3.3 索引分类和建索引命令语句3.4 索引结构与检索原理3.5 哪些情况适合建索引3.6 哪些情况不适合建索引 4 性能分析4.1 性能分析前提知识4.2 Explain…

Sql优化总结!详细!(2021最新面试必问)

Sql优化 Sql执行顺序基础Sql优化查询SQL尽量不要使用select *,而是具体字段避免在where子句中使用or来连接条件使用varchar代替char尽量使用数值替代字符串类型查询尽量避免返回大量数据使用explain分析你SQL执行计划是否使用了索引及其扫描类型创建name字段的索引优…

如何破解VS2015(使用秘钥)

【时间】2018.10.07 【题目】如何破解VS2015(使用秘钥) 安装完vs2015 企业版/专业版后,在菜单帮助---注册产品,会显示产品试用期30天,怎么破解呢?其实只要输入相应的秘钥即可完成破解。如若不破解&#x…

vs2015激活码

microsoft visual studio2015是微软推出的一款集程序设计网页开发于一身的开发工具。microsoft visual studio 2015支持c,c,c#以及手机应用开发,用它所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET F…

VS2017 激活密钥

【时间】2018.11.26 【题目】VS2017 激活密钥 一、激活秘钥 Enterprise[企业版]: NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Professional[专业版]: KBJFW-NXHK6-W4WJM-CRMQB-G3CDH 二、秘钥使用 使用位置在 帮助 -- 注册商品 中: 输入秘钥后,激活成功后&a…

Android APP性能测试以及性能指标

Android的app性能测试包括的测试项:Activity响应时间,帧率,内存,cpu消耗,耗电量,冷启动 Activity响应时间的相关测试 查看当前APP打开的页面命令: adb shell dumpsys activity | findstr mResumedActivity然后用命令去打开APP的某个activ…

APP性能测试之GT 测试

APP性能测试之GT 测试 1 什么是 GT GT(随身调)是腾讯研发的开源 APP 随身调测平台,它是直接运行在手机上的“集 成调测环境”(IDTE, Integrated Debug Environment)。 GT 仅凭一部手机,无需连接电脑&a…

面试百问:如何测试App性能?

APP性能测试几乎是客户端面试必问。 为什么要做App性能测试 如果APP总是出现卡顿或网络延迟的情况,降低了用户的好感,用户可能会抛弃该App,换同类型的其他应用。如果APP的性能较好,用户体验高,使用起来丝滑顺畅&…