我有一个理论上的问题,在网上找不到一个好的解决方案:
对于有100,000个recs的tblA。
我希望运行多个进程/应用程序,每个进程/应用程序都访问tblA。
我不希望这些应用程序访问相同的recs。也就是说,我希望appA访问前50行,appB访问下50行,appC访问后50行。
因此,基本上我希望应用程序在表中的下一个"N“个recs上执行一种抓取。我正在寻找一种方法来尽可能快地访问/处理行数据,本质上是以同时运行的方式运行应用程序。但我不希望应用程序处理相同的行。
那么,这种过程到底应该如何建立呢?
它是不是只是在做一种:
select from tblA limit 50
and doing some kind of row locking for each row (which requires innodb)指针/psuedo代码会很有用。
发布于 2012-02-25 06:08:30
以下是数据库管理员StackExchange关于此问题的一些帖子
它讨论了SELECT ... LOCK IN SHARE MODE和随之而来的潜在问题。
Percona和SELECT ... FOR UPDATE就此写了一篇很好的文章
发布于 2012-02-25 06:26:45
您的应用程序应该处理它想要访问的数据。在其中创建一个指针。如果您使用的是存储过程,请使用另一个表来存储指针。每个进程将在开始处理之前“保留”一组行。每个进程都应该检查其中的最大值,并查看它是否大于表的长度。
发布于 2012-02-25 10:17:44
如果您专门寻找处理第一个集合、第二个集合等,则可以使用带有ORDER BY的LIMIT #(即0,50 51,100 101,150)。锁定是不必要的,因为进程甚至不会尝试访问彼此的记录集。但是我不能想象这样的场景会是一个很好的实现。
另一种方法是只使用有限制的update,然后选择已更新的记录。您可以使用进程ID、随机数或几乎可以保证在所有进程中唯一的其他值。在您的表中添加一个"status“字段,指示记录是否可用于处理(即值为NULL)。然后,每个进程将状态字段更新为“拥有”要处理的记录。
UPDATE tblA SET status=1234567890 WHERE status IS NULL LIMIT 50;
SELECT * FROM tblA WHERE status=1234567890;这将适用于MyISAM或Innodb。使用Innodb,您将能够同时运行多个更新,从而提高性能。
https://stackoverflow.com/questions/9436728
复制相似问题