[英]How to select unique records using limit in multiple MySQL statements
我有10個單獨的php chron作業正在運行,該作業使用同一表一次選擇100條記錄
SELECT `username` FROM `data` where `id` <> = '' limit 0,100
如何確保每個記錄集都是唯一的? 有沒有一種方法可以確保每個同步作業不會選擇相同的100條記錄?
如果有幫助,用戶名是唯一的。
謝謝
喬納森
您可以選擇其他100條記錄:
limit 100,100
, limit 200,100
...
或隨機選擇100:
...FROM
數據where
id <> = '' ORDER BY RAND() LIMIT 0,100
如果要確保不會選擇兩次記錄,則必須標記該記錄(“使其變臟”),因此其他cron作業將只能查詢尚未選擇的記錄。 只需添加另一個稱為chosen
布爾鍵,然后在選擇給定記錄后將其標記為true。 您必須一個一個地運行cron作業,或者使用鎖定或互斥機制來確保它們不會並行運行並且相互競爭。
您可以做的是“標記”每個作業將要使用的記錄-訣竅是確保標記時沒有競爭條件。 這是一種方法。
create table job
(
job_id int not null auto_increment,
#add any other fields for a job you might want
primary key(job_id)
);
# add a job_id column to data
alter table data add column job_id not null default '0', add index(job_id);
現在,當您要處理100條數據行時,可以通過在行中插入一行並獲取自動生成的ID來獲得唯一的job_id。 這是您可以在mysql命令行客戶端中執行此操作的方式,盡管很容易看出它如何適應代碼:
insert into job (job_id) values(0);
set @myjob=last_insert_id();
然后,標記一百行當前為0
update data set job_id=@myjob where job_id=0 limit 100;
現在,您可以花時間處理所有位於job_id = @ myjob的行,這是安全的,因為沒有其他進程會碰到它們。
毫無疑問,您將需要對此進行調整以適合您的問題,但這說明了如何使用MySQL的簡單功能來避免並行進程之間爭用同一記錄的競爭情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.