0

我目前在清单表中有 20,000 行,而且这个查询已经运行得很慢。

它的作用是删除自列表 endDate 以来当前时间为 60 秒或更长时间且列表与任何任务无关的所有列表行。

DELETE
    listing
FROM
    listing
LEFT JOIN
    task
ON
    task.listingId = listing.listingId
WHERE
        task.listingId      IS NULL
    AND listing.endDate     < DATE_SUB(NOW(), INTERVAL 1 MINUTE)

有没有更快的方法来删除孤立的列表行?

更新:

原始(上图)查询需要 11.6 秒。

这个等效的一堆查询需要 0.09 秒,但它更混乱,需要一堆 PHP:

$q = "
    SELECT
        listingId
    FROM
        task
";
$result = mysql_query($q) or die(mysql_error());

$taskListingIds = array();

while ($task = mysql_fetch_array($result)) {
    $taskListingIds[$task['listingId']] = NULL;
}

$q = "
    SELECT
        listingId
    FROM
        listing
    WHERE
        endDate < DATE_SUB(NOW(), INTERVAL 1 MINUTE)
";
$result = mysql_query($q) or die(mysql_error());

while ($listing = mysql_fetch_array($result)) {
    if (!array_key_exists($listing['listingId'], $taskListingIds)) {
        $q = "
            DELETE
            FROM
                listings
            WHERE
                listingId = " . $listing['listingId'] . "
        ";
        mysql_query($q) or die(mysql_error());
    }
}

我现在会坚持这一点,但是任何关于纯粹使用 SQL 的快速方法的建议都会很棒。

4

0 回答 0