我目前在列表中有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来快速完成此操作的任何建议都会很棒。