我正在尝试加快我网站上的数据分页。我想使用以下查询,但是当我执行EXPLAIN时,它说它需要扫描超过40,000行:
SELECT `Item`.`id`, `User`.`id`
FROM `items` AS `Item`
LEFT JOIN `users` AS `User`
ON (`Item`.`submitter_id` = `User`.`id`)
WHERE `Item`.`made_popular` < "2010-02-08 22:05:05"
AND `Item`.`removed` != 1
ORDER BY `Item`.`made_popular` DESC
LIMIT 26
但是如果我为“made_popular”字段添加下限,则只需要扫描99行(这两个日期之间的项目数)。
SELECT `Item`.`id`, `User`.`id`
FROM `items` AS `Item`
LEFT JOIN `users` AS `User`
ON (`Item`.`submitter_id` = `User`.`id`)
WHERE `Item`.`made_popular` < "2010-02-08 22:05:05"
AND `Item`.`made_popular` > "2010-02-07 22:05:05"
AND `Item`.`removed` != 1
ORDER BY `Item`.`made_popular` DESC
LIMIT 26
两个查询都使用我在“made_popular”列上的索引。 在这两种情况下,假设没有“已删除”的项目,它应该只扫描26行吗?我想解决方案可能是使用第二个查询并添加一个可能足够低的下限来给我26个项目,但似乎很奇怪我应该像这样做一个解决方法。
答案 0 :(得分:2)
but when I do an EXPLAIN it says it needs to scan over 40,000 rows:
通常会误解rows
的含义。它表示可用于返回结果的大致行数,无论 LIMIT
子句。
所以你不必担心这种情况 - mysql在达到LIMIT
金额后立即停止提取数据。