1 min 数据查询 SQL 优化
问题
前几天线上数据库 IOPS 飙升,一直居高不下,最近并没有升级。遂查看数据库正在执行的 SQL 语句,发现有个查询离线设备的语句极其缓慢。
探寻原因
SELECT o.*
FROM
(
SELECT *
FROM pim_online
WHERE t2 IS NOT NULL
AND username LIKE 'd.f.%'
AND t2 + 32 * 60 * 1000 > +currentTimeMillis
AND t2 + 32 * 60 * 1000 < currentTimeMillis
) o
WHERE o.username NOT IN (
SELECT username
FROM pim_online
WHERE username LIKE 'd.f.%'
AND t1 + 32 * 60 * 1000 > currentTimeMillis
)
GROUP BY o.username;
这段 SQL 执行特慢。以我的 SQL 知识分析,原因分析如下:
- 子查询很慢
- like 操作符很慢
优化
实现相同的功能,不一定要这么实现,可以用别的方式实现,用很简单的 group by 就能完成,group by 的字段还有索引。
SELECT
DISTINCT
username,
max(t2) mt2
FROM pim_online
WHERE t2 IS NOT NULL
AND left(username, 3) = 'd.f'
AND t2 > 32 * 60 * 1000
AND t2 < 30 * 60 * 1000
AND t1 < 32 * 60 * 1000
GROUP BY username;
测试
用了 Java 生成 SQL 语句进行本地测试(排除网络延迟)。在数据量百万级别的时候,优化的 SQL 只需 80 ms 左右,原 SQL 需要 1200 ms,可谓惊人。
结论
- 子查询很慢
- like 操作符很慢
- 换种思路
1 min 数据查询 SQL 优化的更多相关文章
- 高级数据查询SQL语法
接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL语法, ...
- SQL大量数据查询的优化 及 非用like不可时的处理方案
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 查询SQL优化
SQL优化的一般步骤 通过show status命令了解各种SQL的执行频率定位执行效率较低的SQL语句,重点select通过explain分析低效率的SQL确定问题并采取相应的优化措施 优化措施 s ...
- 树形查询SQL优化一例
上周五一哥们发了条SQL,让我看看,代码如下: SELECT COUNT(1) FROM (select m.sheet_id from cpm_main_sheet_history m, cpm_s ...
- mysql 查询重复的(不区分大小写)数据的SQL优化
在mysql中查询不区分大小写重复的数据,往往会用到子查询,并在子查询中使用upper函数来将条件转化为大写.如: select * from staticcatalogue WHERE UPPER( ...
- sqlserver 数据查询效率优化
首先优化是具体情况具体分析,从硬件.改进表结构.索引.改进sql查询语句.存储方式都有关系等多方面入手 比如单表数据量(100w-200w条)不大的情况下,查询效率慢 可以从优化sql语句.对多个排序 ...
- oracle查询SQL优化相当重要
如果表中的时间字段是索引,那么时间字段不要使用函数,函数会使索引失效. 例如: select * from mytable where trunc(createtime)=trunc(sysdate) ...
- Mysql 分页查询sql优化
先查下数据表的总条数: SELECT COUNT(id) FROM ts_translation_send_address 执行分页界SQL 查看使用时间2.210s SELECT * FROM ts ...
- mysql联合查询sql优化
我们在使用mysql数据库时,经常会使用到mysql的联合查询,联合查询分为内连接和外连接,内连接查询结果是联合的表都存在匹配才会有结果,外连接则根据驱动表是否存在匹配来生成结果集. 这里使用mysq ...
随机推荐
- 【t010】最近距离
Time Limit: 1 second Memory Limit: 32 MB [问题描述] 聚类方法要求将空间中的点集,按照一点的方式进行归类,要求每一类中的点集相互之间的距离足够的"近 ...
- 访问Ext.ComponentMgr中的组件对象
Ext.Component是所有Ext组件的基类,所有组件被注册在布局管理器中Ext.ComponentManager, 这样就可以通过Ext.getCmp随时被引用,每种组件都有特定的类型,是Ext ...
- Install .NET Core SDK on Linux CentOS / Oracle x64 | .NET
原文:Install .NET Core SDK on Linux CentOS / Oracle x64 | .NET Linux发行版 CentOS / Oracle添加dotnet产品Feed ...
- JVM源码系列:ThreadMXBean 打出堆栈信息原理分析
我们通常会使用工具jstack 去跟踪线程信息,其如何实现使用attach 的方式还是ptrace 的方式,这些可以去参考本人的博客的其他文章. 但这些方式都是外部使用的方式,如何直接使用java代码 ...
- js进阶 9 js操作表单知识点总结
js进阶 9 js操作表单知识点总结 一.总结 一句话总结:熟记较常用的知识点,对于一些不太常用的知识点可以在使用的时候查阅相关资料,在使用和练习中去记忆. 1.表单中学到的元素的两个对象集合石什么? ...
- 76个值得你注意的erlang编程习惯
http://www.tuicool.com/articles/ZNzuyu 前言 学习Erlang的时候在书的留白处随手记录了一些东西,还有一些记录在了demo的注释里面,今天抽时间整理出来了一部分 ...
- echarts多条折线图和柱状图实现
参考链接:echarts官网:http://echarts.baidu.com/原型图(效果图): 图片.png 代码: <!DOCTYPE html> <html> < ...
- Oracle数据库零散知识06 -- Package的定义与简单触发器
CREATE OR REPLACE PACKAGE pak_02 IS--包头 --这里可定义公共参数 FUNCTION fun_01 RETURN NUMBER; PROCEDURE pro_01 ...
- spring boot jar 部署linux服务器
用命令启动spring boot 项目,一旦终端命令窗口关闭,项目也就关闭了,所以我们采用脚本的方式来运行jar 正常命令 java -jar xxx.jar 脚本启动,vim 创建 start.sh ...
- Network management system scheduling for low power and lossy networks
In one embodiment, a network management system (NMS) determines an intent to initialize a request-re ...