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

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

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

我打算将mysql与innodb一起使用(我可以使用它可以使用的任何其他设置),但它尚未最终确定,因此,如果mysql无法正常工作,还有其他东西可以使用(我之前使用过hbase,但首先在其中寻找mysql解决方案)如果我遇到问题,似乎使用更广泛,更容易获得帮助)?

最佳答案

哇。您正在加载大量数据。为了达到这个目的,可能值得进行大量的设计思考。

多个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服务器的文件系统以写入要加载的数据文件。

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

关于mysql - 我可以使用多个服务器来提高mysql的数据上传性能吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10272974/

10-11 03:06
查看更多