首先,对于这个问题的“新手”性质,我深表歉意。我在 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/