0

我正在设置一个mysql服务器来存储一些数据,但意识到(在这个周末读了一点之后)我可能无法及时上传数据。

我基本上有多个服务器生成每日数据,然后将其发送到共享队列进行处理/分析。数据大约有 50 亿行(尽管它的数据非常小,一列中有一个 ID 号,另一列中有一个整数字典)。我看到的大多数性能报告都显示插入速度为 60 到 100k/秒,这需要 10 多个小时。我们需要非常快的数据,这样我们就可以在那天处理它,然后我们可能会丢弃它(或者将表实现到 S3 或其他东西)。

我能做些什么?我有 8 台服务器可供我使用(除了数据库服务器),我可以使用它们来加快上传速度吗?起初我正在考虑使用它们同时将数据推送到服务器,但我也在想也许我可以将数据加载到每个服务器上,然后以某种方式尝试将所有分离的数据合并到一个服务器中?

我打算将 mysql 与 innodb 一起使用(我可以使用它有帮助的任何其他设置)但它没有最终确定,所以如果 mysql 不起作用,还有其他东西可以吗(我以前使用过 hbase,但首先在寻找 mysql 解决方案万一我遇到的问题似乎被更广泛地使用并且更容易获得帮助)?

4

1 回答 1

1

哇。这是您正在加载的大量数据。为了做到这一点,可能值得进行相当多的设计思考。

多个 mySQL 服务器实例对加载速度没有帮助。不同之处在于您的 mySQL 服务器上的快速处理器芯片和非常快速的磁盘 IO 子系统。如果您可以使用 64 位处理器并为其配备大量 RAM,则您可以为您的大表使用 MEMORY 访问方法,这确实非常快。(但如果这对你有用,一个巨大的 Java HashMap 可能会更好。)

问问自己:为什么需要将此信息存储在 SQL 可查询表中?加载数据后,您将如何使用数据?您会运行大量查询来检索单行还是仅检索数十亿行中的几行?SUM(something) ... GROUP BY something_else或者您将运行通过大部分表进行的聚合查询(例如)?

您是否必须在数据未完全加载时访问数据?或者你可以在第一次访问之前加载一整批数据吗?

如果您的所有查询都需要研磨整个表,那么不要使用任何索引。否则做。但是不要放入任何你不需要的索引。它们会花费你大量的时间加载性能。

考虑为此表使用 myISAM 而不是 InnoDB;myISAM 缺乏事务语义使其加载速度更快。myISAM 可以很好地处理聚合查询或少行查询。

您可能希望为每天的数据创建一个单独的表,因此您可以通过重命名表或简单地访问新表来“摆脱”昨天的数据。

您应该考虑使用 LOAD DATA INFILE 命令。

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

此命令使 mySQL 服务器从mySQL 服务器的文件系统中读取文件并将其直接批量加载到表中。这比从另一台机器上的客户端程序执行 INSERT 命令要快得多。但在生产环境中设置也比较棘手:您的共享队列需要访问 mySQL 服务器的文件系统才能写入数据文件以进行加载。

您应该考虑禁用索引,然后加载整个表,然后重新启用索引,但前提是您不需要查询部分加载的表。

于 2012-04-23T00:13:39.323 回答