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. 换种思路
  • 相关阅读:
    centos下nginx的启动
    CentOS7.0安装Nginx 1.7.4
    序员的自我修养
    消息队列 rabbitMQ 的一些操作
    centos linux7的一些操作
    Windows 10 Install rabbitmq-server-3.6.9
    Redis 3.2.100 Windows 32位下载
    Redis配置文件详解
    yii2优化
    mysql中的schema 等价于database,相当于一个数据库
  • 原文地址:https://www.cnblogs.com/Piers/p/9363550.html
Copyright © 2011-2022 走看看