优化查询和优化表

时间:2013-12-02 20:54:20

标签: mysql sql

`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,以便2台计算机不会获取任何电子邮件ID。

最好的方法是什么? 有数百万的电子邮件ID。 这里例如我已经表明,在一个查询中,100个电子邮件ID被提取,它可以根据需要而变化。

1 个答案:

答案 0 :(得分:1)

我的建议是通过自动增量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上使用索引。缺点是如果在初始查询和检索数据的查询之间行数增加,您可能会遗漏一些行。

我不明白你的lastFetchedID字段,但它看起来像是你试图用来实现上面提到的那些容易实现的不必要的机制。