mysql - 优化查询和优化表

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

最佳答案

我的建议是通过自动增量 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字段,但看起来这是一个不必要的机制,你试图用它来实现如上所述可以轻松实现的目标。

关于mysql - 优化查询和优化表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20337620/

相关文章:

sql - 如何在 Netezza 中将整数字段转换为日期?

sql - postgres 选择聚合时间跨度

mysql - 使用 UNION 处理重复结果

php - Laravel 密码重置不起作用

使用预定义值列表作为 SQL 表的 SQL 语句

sql - Oracle 12c 解析函数

python - SQLite 返回日期超过一周的记录

php - 在 codeigniter 中插入评论问题

mysql - 在 Node.js Jade 中需要帮助

mysql - 选择的列在链接表中不存在