2011-01-22 79 views
12

所以我有一個超過5百萬行的表。當我使用SQL_CALC_FOUND_ROWS時,查詢只是永遠掛起。當我把它拿出來時,查詢會在第二個LIMIT中執行,25。我的問題是分頁的原因是否有替代獲得總行數?Mysql SQL_CALC_FOUND_ROWS和分頁

回答

6

SQL_CALC_FOUND_ROWS強制MySQL掃描所有匹配的行,即使它們永遠不會被抓取。在內部它相當於沒有LIMIT子句的同一個查詢。

如果您通過WHERE進行的過濾不太瘋狂,則可以計算和緩存各種類型的過濾器以保存calc_found_rows施加的全掃描負載。基本上運行「選擇計數(*)從...哪裏....」最可能的where子句。否則,你可以去谷歌風格,只是吐出一些偶爾與現實毫不相干的頁碼(你知道,你看到「Goooooooooooogle」,進入第3頁,並突然用完了結果)。

+0

是的,有些結果會返回超過一百萬條記錄,所以這將有助於爲什麼查詢掛起。那麼我想它應該只是一個鏈接到下一頁或上一頁,但不要做分頁,它允許你跳到不同的頁面。如果有超過一百萬的人返回,我不認爲他們在意第10k頁。 – John 2011-01-22 03:21:05

+0

@Marc,我知道這是一個老問題,但我發現自己面臨着是否使用SQL_CALC_FOUND_ROWS或從我的查詢中刪除LIMIT子句的問題。從你的答案看來,你似乎說這些應該表現相同。這是一個安全的假設,還是比這更復雜?謝謝。 – 2012-08-24 19:45:50

-1

你應該COUNT(*),並根據情況SQL_CALC_FOUND_ROWS之間進行選擇。如果您的查詢搜索條件使用索引中的行 - 請使用COUNT(*)。在這種情況下,Mysql只會從索引中「讀取」而不觸及表中的實際數據,而SQL_CALC_FOUND_ROWS方法將從磁盤加載行,這對於大量表而言可能是昂貴和耗時的。

有關此主題的更多信息,請致電this article @mysqlperformanceblog