有一個在這個博客很好的說明:https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
的演示表明,是的,使用SQL_CALC_FOUND_ROWS是非常糟糕的表現,當你使用它的一大桌。
它往往是更好地單獨運行兩個查詢:
/* no need to do the join in this case, because it won't affect the count */
SELECT COUNT(*)
FROM main_articles
WHERE `article_type`='2'
SELECT main_article.*
FROM main_articles
LEFT JOIN main_members
ON article_mem_id=member_id
WHERE `article_type`='2'
ORDER BY article_id
DESC LIMIT 0,20
順便說一句,這是不相關的SQL_CALC_FOUND_ROWS問題,但我不知道爲什麼要加入到main_members
表。您不會從中獲取任何列。 LEFT JOIN意味着它不會限制行。如果我可以從列名中推斷出表關係,那麼對於main_articles
中的每一行,main_members
中只能有一行,所以連接也不會增加行數。所以這樣做並沒有任何目的。
除了將索引添加到where子句的字段之外,沒有什麼可以做的。你迫使DB掃描整個表的所有可能的匹配,因此可以做到發現行計算。 – 2014-10-02 15:07:49
我不明白你在說什麼的兄弟嗎? – knsmith 2014-10-02 17:04:31