我目前在清单表中有 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 的快速方法的建议都会很棒。