`CREATE TABLE emailAddress
(
ID int NOT NULL AUTO_INCREMENT,
EMAILID varchar(255),
LastIDfetched int,
PRIMARY KEY (ID)
)
SELECT LastIDfetched WHERE ID=1; //say this value is x
SELECT EMAILID FROM emailAddress WHERE ID>x && ID<x+100;
UPDATE emailAddress SET LastIDfetched=x+100 WHERE ID=1;`基本上,我正在尝试使用并行运行的多台计算机从数据库中获取所有电子邮件id,这样两台计算机都不会提取任何电子邮件id。
做这件事最好的方法是什么?有数百万个电子邮件id。例如,我在这里展示了在一个查询中提取100个电子邮件id,它可以根据需要而变化。
发布于 2013-12-03 05:06:31
我的建议是通过自动增量ID进行查询。如果自动增量系统中存在差距,您可能不会得到候选计算机之间的准确记录拆分,但这应该是非常好的。
一种方法是简单地查看自动增量ID的剩余部分,并获取具有某个特定值的所有项。
SELECT `EMAILID`
FROM `emailAddress`
WHERE ID % X = Y这里的X等于您正在使用的计算机的数量。Y将是一个介于0和X-1之间的整数,它对于运行查询的每台机器都是唯一的。
这里的缺点是,您不能在此查询上使用索引,因此,如果您需要大量执行此查询,或者在处理流量的生产系统上,这可能是有问题的。
另一种方法是确定表中的行数,并将查询拆分成组
SELECT COUNT(`ID`) FROM `emailAddress`; // get row count we will call it A below
SELECT `EMAILID`
FROM `emailAddress`
WHERE ID
ORDER BY ID ASC
LIMIT (A/X) * Y, (A/X)这里,X是机器的数量,Y是每台机器的唯一整数(从0到X -1)
这样做的好处是可以对ID使用index,缺点是如果初始查询和检索数据的查询之间的行数增加,可能会遗漏一些行。
我不理解你的lastFetchedID领域,但它看起来是一种不必要的机制,你试图用它来实现上面提到的容易实现的目标。
https://stackoverflow.com/questions/20337620
复制相似问题