zoukankan      html  css  js  c++  java
  • 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 知识分析,原因分析如下:

    1. 子查询很慢
    2. 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,可谓惊人。

    结论

    1. 子查询很慢
    2. like 操作符很慢
    3. 换种思路
  • 相关阅读:
    适配器模式(16)
    状态模式(15)
    用反射技术替换工厂种的switch分支(14)
    2017年目标与规划
    抽象工厂模式(13)
    观察者模式(12)
    建造者模式(11)
    TCP 可靠传输与流量控制的实现
    TCP报文段的首部格式
    TCP可靠传输的工作原理
  • 原文地址:https://www.cnblogs.com/Piers/p/9363550.html
Copyright © 2011-2022 走看看