如何在多个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

如何确保这些记录集中的每一个都是唯一的?有没有办法确保每个chron作业不会选择相同的100条记录?

username是唯一的,如果有帮助的话。

感谢

Jonathan

  • 您可以选择不同的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个数据行时,可以通过在job中插入一行并获得自动生成的id来获得唯一的job_id

insert into job (job_id) values(0);
set @myjob=last_insert_id();

然后,标记100行当前为0

update data set job_id=@myjob where job_id=0 limit 100;

现在,您可以慢慢来处理job_id=@myjob的所有行,因为您知道没有其他进程会接触到它们。

毫无疑问,您需要对此进行调整以适应您的问题,但这说明了如何使用MySQL的简单功能来避免并行进程之间竞争访问相同记录的竞争条件。