MYSQL在过去10分钟内删除每个id、标题的重复行

MYSQL在过去10分钟内删除每个id、标题的重复行,mysql,duplicates,rows,Mysql,Duplicates,Rows,我目前有它删除重复,但这个过程太长,所以我试图精简它,而不是让它定期检查新的重复通过可能的cron作业后,或把它变成一个php脚本。ID是主键。这是我到目前为止所拥有的 这会检查重复项,并且效果良好 SELECT title, COUNT(title) FROM `ttrss_entries` WHERE date(date_entered) >= NOW() - INTERVAL 10 MINUTE GROUP BY title HAVING COUNT(title) >

我目前有它删除重复,但这个过程太长,所以我试图精简它,而不是让它定期检查新的重复通过可能的cron作业后,或把它变成一个php脚本。ID是主键。这是我到目前为止所拥有的

这会检查重复项,并且效果良好

SELECT title, COUNT(title) 
FROM `ttrss_entries` 
WHERE date(date_entered) >= NOW() - INTERVAL 10 MINUTE 
GROUP BY title 
HAVING COUNT(title) > 1
删除将删除重复项,但需要大约30分钟才能完成。我希望我可以添加日期时间,每5分钟左右检查一次过去的10分钟

DELETE n1 
FROM `ttrss_entries` n1, `ttrss_entries` n2 
WHERE n1.id > n2.id AND n1.title= n2.title


$usth = $pdo->prepare(
                    "INSERT INTO ttrss_entries
                        (title,
                        guid,
                        link,
                        updated,
                        content,
                        content_hash,
                        no_orig_date,
                        date_updated,
                        date_entered,
                        comments,
                        num_comments,
                        plugin_data,
                        lang,
                        author)
                    VALUES
                        (?, ?, ?, ?, ?, ?,
                        false,
                        NOW(),
                        ?, ?, ?, ?, ?, ?)");

                    $usth->execute([$entry_title,
                        $entry_guid_hashed,
                        $entry_link,
                        $entry_timestamp_fmt,
                        "$entry_content",
                        $entry_current_hash,
                        $date_feed_processed,
                        $entry_comments,
                        (int)$num_comments,
                        $entry_plugin_data,
                        "$entry_language",
                        "$entry_author"]);

如果cron不可能做到这一点,那么一天一次就足够了。但是加载时间对于删除过程来说太长了。

如果不能使用cron,那么一天一次就足够了。但是加载时间对于删除过程来说太长了。

确切地说,为什么您要跟踪重复项以进行删除,而不是在tress.title上设置一个唯一的约束,以防止重复项首先被插入

或者你可以让你的代码使用
INSERT。。。在重复密钥更新时…

或者您可以编写一个before insert触发器来执行此操作


追踪重复项似乎比阻止重复项更糟糕。

确切地说,为什么要追踪重复项以进行删除,而不是在tress.title上设置唯一的约束以防止重复项被插入

或者你可以让你的代码使用
INSERT。。。在重复密钥更新时…

或者您可以编写一个before insert触发器来执行此操作


追踪重复项似乎比防止重复项更糟糕。

cron作业?但你肯定只会运行一次吗?每天一次,但它确实会添加大量副本,因此我需要找到一种方法,避免在插入失败时创建副本,或者在一小时内将其作为cronjob/脚本运行多次。是的。找到一种方法来防止在cron作业中创建重复项?但你肯定只会运行一次吗?每天一次,但它确实会添加大量副本,因此我需要找到一种方法,避免在插入失败时创建副本,或者在一小时内将其作为cronjob/脚本运行多次。是的。找到一种防止复制的方法,因为它是一个名为Tiny Tiny RSS的预制脚本,我相信代码中已经有了。不幸的是,它没有成功。代码是否受到了唯一的约束?如果是这样的话,一个before insert触发器应该允许你默默地丢弃重复的内容。我发现它只检查重复的散列,而不是重复的标题或内容。因此,我不确定是否可以使用该方法,我将发布上面的插入代码。您可以以任何方式定义唯一约束,问题是,当代码试图插入一条记录时,数据库是否会返回一个错误,这将导致唯一约束冲突。好的,我收到了这个错误消息E_USER_NOTICE(1024)SQLSTATE[42000]:语法错误或访问冲突:1064因为它是一个名为Tiny Tiny RSS的预制脚本,我相信代码中已经有了。不幸的是,它没有成功。代码是否受到了唯一的约束?如果是这样的话,一个before insert触发器应该允许你默默地丢弃重复的内容。我发现它只检查重复的散列,而不是重复的标题或内容。因此,我不确定是否可以使用该方法,我将发布上面的插入代码。您可以以任何方式定义唯一约束,问题是,当代码试图插入一条记录时,数据库是否会返回一个错误,该记录将导致唯一约束冲突。好的,我收到了这个错误消息E_USER_NOTICE(1024)SQLSTATE[42000]:语法错误或访问冲突:1064