2011-02-09 59 views
0

我正在努力加快我的網站上的數據分頁。我想用下面的查詢,但是當我做一個解釋說,它需要掃描超過40,000行:用MySQL高效分頁

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

LIMIT N,M允許您設置偏移量(N)和返回結果的數量(M)。 LIMIT 1,26是否可以提高性能? – 2011-02-09 03:32:52

回答

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

通常會誤解rows的含義。這意味着可以用來返回結果而不管LIMIT子句的大概行數。

所以你不應該擔心在這種情況下 - mysql會在達到LIMIT的數量後停止獲取數據。

+0

好的,這兩個查詢應該完全一樣嗎?有沒有辦法找出需要掃描的行數,並考慮限制條款? – makeee 2011-02-09 03:33:27