繁体   English   中英

加快在mysql上的操作

[英]speed up operation on mysql

我目前正在针对具有十个节点的集群编写针对mysql的Java项目。 该程序只是从数据库中提取一些信息并进行一些计算,然后将一些数据推回到数据库中。 但是,表中有数百万行。 有什么方法可以分散工作并利用集群体系结构吗? 如何在不同的节点上执行多线程?

我观看了有关使用Gearman在mysql数据库上执行Map / Reduce样式的事情的有趣演示。 可能是您要寻找的东西:请参阅此处 此处的mysql网页上有一个录音(不过必须注册mysql.com)。

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

由于您只有一个数据库,因此在应用程序端没有任何并行性或集群性将有很大的不同。

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

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

由于只有一台mysql服务器,因此请确保使用innodb引擎来减少更新时的表锁定。

另外,即使您必须运行更多查询,我也会尽量使查询保持简单。 这样可以增加查询缓存命中的机会,并减少后端的总体工作量,减轻一些查询匹配的负担,并为前端(您拥有更多资源)工作。 它还将减少持有行锁的时间,从而减少争用。

建议的Gearman解决方案可能是完成此工作的正确工具。 因为它将允许您透明地将批处理从mysql卸载回群集。

您可以在每台计算机上使用mysql设置分片,但是与Gearman解决方案相比,设置时间,维护和对数据库访问层的更改可能需要大量工作。 您可能还想看一下实验性的蜘蛛引擎,该引擎可以允许您同时使用多个mysql。

我会考虑在数据库服务器上的存储过程中进行该计算,然后将数百万行带到中间层。 您将在网络上节省很多字节。 根据计算的性质,模式,索引等,您可能会发现数据库服务器具备进行该计算的能力,而不必求助于多线程。

我可能是错的,但值得一看的原型。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM