mysql - SQL - 慢速子查询

标签 mysql sql

首先,对于这个问题的“新手”性质,我深表歉意。我在 stack-exchange 上看到了许多其他慢速子查询问题,但我不确定如何将修复应用到我的问题。除了简单的选择、插入等,我对任何 SQL 都很陌生。

我有一个打印机监控系统,它每五分钟将一系列设备的结果记录到 MySQL 表 (trends_uint) 中。它记录:设备 ID (itemid)、时间戳 (clock) 和打印的页面 (value_avg)。从 PhpMyAdmin 我可以看到表索引是 itemid 和 clock 的组合,我猜它们一起提供了一个唯一的值。到目前为止,该表有大约 200 万行。

我的查询如下:

SELECT
     tu1.itemid AS trends_uint_itemid,
     tu1.clock AS time_value,
     tu1.value_avg AS pages
FROM
     trends_uint tu1
WHERE
    (tu1.clock = (
                     SELECT max(tu2.clock)
                     FROM trends_uint tu2
                     WHERE tu1.itemid = tu2.itemid
                  )
    )
ORDER BY tu1.clock DESC;

我想做的是为每个设备 (itemid) 选择最新的值(即最高时钟的 value_avg),这样我就可以绘制出每台打印机到目前为止打印的页数。

我已经尝试为返回以下内容的查询运行 EXPLAIN:

id  select_type         table   type    possible_keys   key         key_len     ref                 rows        Extra
1   PRIMARY             tu1     ALL     NULL            NULL        NULL        NULL                1527815     Using where; Using filesort
2   DEPENDENT SUBQUERY  tu2     ref     PRIMARY         PRIMARY     8           zabbix.tu1.itemid   115301      Using index

如有任何帮助,我们将不胜感激。提前致谢。

最佳答案

这样的查询怎么样:

SELECT ...
FROM trends_uint t
INNER JOIN (
    SELECT MAX(clock) AS clock, itemid
    FROM trends_uint
    GROUP BY itemid
) x ON x.itemid = t.itemid AND t.clock = x.clock

假设您的表中有一个复合索引:itemid + clock(按此特定顺序)

关于mysql - SQL - 慢速子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15635528/

相关文章:

mysql - 获取客户通话的总费用

MySQL - 根据值分配数字

mysql - 当 clientdataset 打开时 IDE 中的 Stackoverflow

php - 无法将 lat/lng 从 Simplexml 发送到 mysql 数据库

php 如果元素的 strlen 大于,则将数组的每个元素插入到 mysql 中

c# - 从 Windows Phone 7 连接到 MYSQL

sql - 如何创建内部漏斗分析?

mysql - SQL 触发器 : Create row if row doesn't exist

mysql - 从 SQL 中具有 SOME status=0 的表中选择所有信息

mysql - 如何在分组依据中添加空值?