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 ...
随机推荐
- php获取调用本方法的上个方法,php堆栈,函数入库
$array =debug_backtrace(); //print_r($array);//信息很齐全 unset($array[0]); foreach($array as $row) { $ht ...
- ssion机制详解
ssion机制详解 ref:http://justsee.iteye.com/blog/1570652 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚sess ...
- [转载]netcore 使用surging框架发布到docker
demo运行在windows的docker中,系统是win10,所以需要先下载Docker for Windows,安装完毕后系统会重启,然后桌面上可以找到Docker for Windows的快捷图 ...
- C# datatable增加行(datarow)数据为另一个datatable中某行
两个表A和B,两表结构相同.现在需要将A表中部分行拷贝到B表中,直接用 DataTableB.rows.add(dataTableA.rows[0]) 这样的方法式会报"row已经属于A表& ...
- 用Ajax图片上传、预览、修改图片
首选图片的上传和下载并不是很难,但要注意细节. 一,给出前端图片上传的html代码 1.图片上传的控件 <img src="/${res}/images/default.png&quo ...
- USB 3.0规范中译本 第2章 术语及缩略语
本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章列出并定义本规范通篇将使用的术语及缩略语. 术语/略缩语 定义 ACK(确认包) 表示积极肯定的握手包. ...
- spring mvc 解决csrf跨站请求攻击
http://www.dewen.net.cn/q/935/spring+mvc+%E8%A7%A3%E5%86%B3csrf%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82% ...
- gradle导出依赖的jar包
gradle导出依赖的jar包 http://blog.csdn.net/yuhentian/article/details/50426896
- 修改VNC的分辨率
http://blog.csdn.net/jlds123/article/details/9064437 有时候用VNC View打开远程linux桌面时,桌面显示不出来,只有一个灰色背景加上一个命令 ...
- protobuf入门教程
1.简介和安装 2.消息类型 3.proto3 与 proto2 的区别 4.常用序列化/反序列化接口 5.repeated限定修饰符 6.枚举(enum).包(package) 7.导入定义(imp ...