高效的MySQL分页

时间:2011-02-09 03:28:10

标签: mysql pagination

我正在尝试加快我网站上的数据分页。我想使用以下查询,但是当我执行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个项目,但似乎很奇怪我应该像这样做一个解决方法。

1 个答案:

答案 0 :(得分:2)

but when I do an EXPLAIN it says it needs to scan over 40,000 rows:

通常会误解rows的含义。它表示可用于返回结果的大致行数,无论 LIMIT子句。

所以你不必担心这种情况 - mysql在达到LIMIT金额后立即停止提取数据。