MySQL 大表性能不佳
Posted
技术标签:
【中文标题】MySQL 大表性能不佳【英文标题】:MySQL poor performance with a large table 【发布时间】: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 行,但一直在增加。 【参考方案1】:根据您的 EXPLAIN 报告,我看到它显示“type: ALL”,这意味着它正在扫描每个查询的所有行(整个表)。
您需要一个索引来帮助它扫描更少的行。
parent_id=X
的第一个条件是显而易见的选择。您应该创建一个以parent_id
开头的索引。
timestamp >= ...
上的另一个条件可能是最好的第二选择。您的索引应包含 timestamp
作为第二列。
你可以这样创建这个索引:
ALTER TABLE host_monitoring_data ADD INDEX (parent_id, timestamp);
您可能会喜欢我的演示文稿How to Design Indexes, Really 和我演示它的视频:https://www.youtube.com/watch?v=ELR7-RdU9XU
P.S.:当您询问有关查询优化的问题时,请运行 SHOW CREATE TABLE <tablename>
并将其输出包含在您的问题中。这向我们展示了您的列、数据类型、当前索引和约束。不要让我们猜!帮助我们帮助您!
【讨论】:
非常感谢您的帮助。我现在从我的桌子上得到更快的响应。 :) 我一定会在以后的任何帮助请求中包含提到的信息!再次,谢谢你 - 你摇滚。【参考方案2】:三个好技巧:
EXPLAIN(正如其他人所说),会告诉你你在做什么,并提示你做得更好。
避免使用“*”,而是选择您需要的字段。
使用过程分析来了解您需要的最推荐的变量类型是什么(并在需要时更改它们)。
https://dev.mysql.com/doc/refman/5.7/en/procedure-analyse.html
我也尽可能避免使用“order by”。
【讨论】:
以上是关于MySQL 大表性能不佳的主要内容,如果未能解决你的问题,请参考以下文章