选择MySQL,然后删除

选择MySQL,然后删除,mysql,Mysql,我正在设置一个多服务器安装,其中一些用户数据会根据用户的优先级等级(从0到…)在服务器间同步。同步旨在作为一项惰性后台工作来完成,具有更高优先级的用户可以更快地同步数据 为此,我有一个DBTable CREATE TABLE IF NOT EXISTS `spiegel` ( `id` int(11) NOT NULL AUTO_INCREMENT, `priority` tinyint(1) NOT NULL, `cql` varchar(4096) NOT NULL, PRIMARY KEY

我正在设置一个多服务器安装,其中一些用户数据会根据用户的优先级等级(从0到…)在服务器间同步。同步旨在作为一项惰性后台工作来完成,具有更高优先级的用户可以更快地同步数据

为此,我有一个DBTable

CREATE TABLE IF NOT EXISTS `spiegel` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`priority` tinyint(1) NOT NULL,
`cql` varchar(4096) NOT NULL,
PRIMARY KEY (`id`),
KEY `priority` (`priority`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1
其中,所有非零优先级用户都记录了其插入/删除/更新事务。cron作业定期(每10分钟)运行一个PHP脚本,该脚本需要几个(我想限制为N个条目,比如100个)条目,并处理在其他服务器上同步数据库的过程

我想做的是

  • 按优先级排序最多可拾取N个条目
  • 从表中删除这些条目
  • 第一位没问题

    SELECT * FROM `spiegel` ORDER BY priority LIMIT 100;
    
    这就是我对SQL的了解让我失望的地方。我不清楚如何有效地删除“拾取”条目。我所能做的最好的事情就是创建一个CSV列表,列出已删除条目的ID,然后使用

    DELETE FROM `spiegel` WHERE id in idcsvlist
    

    然而,我怀疑这是一种冗长的做事方式。我非常感谢任何能够提出更好方法的人。

    这是一种典型的方法(摘自)

    DELETE FROM `spiegel` WHERE id IN (SELECT id FROM `spiegel` ORDER BY priority LIMIT 100);
    

    试试这个:

    SELECT * FROM `spiegel` ORDER BY priority LIMIT 100;
    
    然后


    任何遇到此线程的人的注意事项。为了交付您需要的结果,我正在跟踪您

    ORDER BY priority DESC
    

    此处的答案中缺少DESC位。

    您可以将要删除的项目存储在临时表中,使用delete语句和where子句从临时表中选择ID,并在您的spiegel表中创建一个on-before-delete触发器来记录已处理的内容。为什么您不能使用MySQL的主从同步,而不是自己进行同步呢。我不想要批发同步。只有在选定用户的优先级设置足够的情况下,才会发生这种情况。B我看了MariaDBs Galera的技术。跨数据中心的同步引入了延迟,这将对我的应用程序产生影响——考虑到同步数据的使用频率较低,这一代价不值得付出。
    ORDER BY priority DESC