【发布时间】:2018-02-12 14:44:08
【问题描述】:
我有一个监控表,其中包含大约 200 多台服务器的监控数据。 每台服务器每天每分钟向表中添加 3 条数据记录。
我为客户保存了 6 个月的历史报告数据,您可以想象该表格变得非常大。
我目前的问题是在这个表上运行 SELECT 查询需要一段时间。 我明白为什么;这是它在执行 SELECT 时处理的大量行,但我试图通过添加时间查找来显着减少结果集......
SELECT * FROM `host_monitoring_data`
WHERE parent_id = 47 AND timestamp > (NOW() - INTERVAL 5 MINUTE);
...但在数据返回给我之前我仍然在看很长时间。
我习惯于使用相当小的桌子,这是迄今为止我使用过的最大的桌子,所以我不熟悉如何克服这类问题。
非常感谢任何帮助。
我的表结构目前是id、parent_id、timestamp、type、U、A、T
U,A,T 是 Used/Available/Total,Type 告诉我我们正在处理什么样的可测量,Timestamp 就是这样,parent_id 是数据所属的父主机的 id,id 是相关记录的自动递增 ID。
当我进行查找时,我基本上是在尝试获取最近的 20 行,其中 parent_id = x 或其他,所以我只是这样做......
SELECT u,a,t from host_monitoring_data
WHERE parent_id=X AND timestamp > (NOW() - INTERVAL 5 MINUTE)
ORDER BY timestamp DESC LIMIT 20
编辑 1 - 包括 EXPLAIN 的结果:
EXPLAIN SELECT * FROM `host_monitoring_data`
WHERE parent_id=36 AND timestamp > (NOW() - INTERVAL 5 MINUTE)
ORDER BY timestamp DESC LIMIT 20
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE host_monitoring_data ALL NULL NULL NULL NUL 2865454
Using where; Using filesort
【问题讨论】:
-
请同时显示查询计划 (EXPLAIN)
-
我不确定你的意思...我正在尝试的查询是一个简单的 SELECT 查询,但问题是由于数据库中的 392861876 行
-
啊抱歉……我现在明白了。添加了上面的信息。我还对大量行进行了分类,以使其现在更易于管理。我现在只处理 2865454 行,但一直在增加。
标签: mysql database transactions query-optimization