繁体   English   中英

优化查询和优化表

[英]optimizing query and optimizing table

`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,它可以根据需要而变化。

我的建议是按自动增量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字段,但看来这是不必要的机制,您正在尝试使用它来轻松实现如上所述的目标。

暂无
暂无

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

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