簡體   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