簡體   English   中英

如何在多個MySQL語句中使用限制選擇唯一記錄

[英]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,100limit 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM