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 大表性能不佳的主要内容,如果未能解决你的问题,请参考以下文章

MySQL大表性能优化

大表的mysql性能问题

MySQL 性能:在大表中排序很慢,即使过滤的子集很小

MySQL 中的 UNION ALL 性能不佳

MySQL 视图 - 性能不佳

MySQL 向大表中添加列的性能