加快对mysql的操作

时间:2009-06-16 01:09:54

标签: java mysql multithreading cluster-computing

我目前正在一个有十个节点的集群中针对mysql编写java项目。程序只是从数据库中提取一些信息并进行一些计算,然后将一些数据推送回数据库。但是,表中有数百万行。有没有办法分割工作并利用集群架构?如何在不同节点上进行多线程处理?

5 个答案:

答案 0 :(得分:1)

我观看了一个关于使用Gearman在mysql数据库上执行Map / Reduce样式的有趣演示。它可能正是您要找的:见here。 mysql网页上有一个录音here(虽然必须注册mysql.com)。

答案 1 :(得分:0)

我考虑在数据库服务器上的存储过程中进行该计算,并将数百万行传递到中间层。你可以在线上节省很多字节。根据计算的性质,架构,索引等,您可能会发现数据库服务器已经准备好进行计算而无需求助于多线程。

我可能错了,但值得一个原型才能看到。

答案 2 :(得分:0)

假设您要处理的表(A)有1000万行。在数据库中创建表B以存储由节点处理的行集。所以你可以用这样的方式编写Java程序,就像它首先获取其他节点处理的最后一行一样,然后在同一个表中添加一个条目,通知其他节点它将处理哪些行范围(你可以决定这个数)。在我们的例子中,假设每个节点一次可以处理1000行。节点1获取表B并将其发现为空。然后,节点1插入一行('Node1',1000),通知它正在处理直到A的主键是< = 1000(假设表A的主键是数字并且它是按升序排列的)。节点2来了,发现1000个主键由其他节点处理。因此,它插入一行('Node2',2000)通知其他人正在处理1001和2000之间的行。请注意,应该同步对表B的访问,即一次只能对其进行处理。

答案 3 :(得分:0)

答案 4 :(得分:0)

除非您的计算非常复杂,否则大部分时间都用于从MySql检索数据并将结果发送回MySQl。

由于您拥有单个数据库,因此应用程序端的并行数或集群数量不会产生太大差异。

因此,如果可能的话,最好的选择是在纯SQL中进行更新,或者使用存储过程,以便所有处理都可以在MySql服务器中进行,并且不需要数据移动。

如果这还不够快,那么您需要在几个MySql实例之间拆分数据库,并提出一些模式来根据某些应用程序密钥对数据进行分区。