2014-10-02 76 views
0

此查詢工作正常時,我們的表中的記錄小於150K,但由於它不工作的罰款&很慢 -SELECT查詢SQL_CALC_FOUND_ROWS很大於慢的250000條記錄

SELECT SQL_CALC_FOUND_ROWS 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 

我怎樣才能提高我的查詢?

+4

除了將索引添加到where子句的字段之外,沒有什麼可以做的。你迫使DB掃描整個表的所有可能的匹配,因此可以做到發現行計算。 – 2014-10-02 15:07:49

+0

我不明白你在說什麼的兄弟嗎? – knsmith 2014-10-02 17:04:31

回答

1

有一個在這個博客很好的說明: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中只能有一行,所以連接也不會增加行數。所以這樣做並沒有任何目的。

+0

我需要左連接,因爲我想從main_member表的一些記錄,這是我加入main_member表到main_article表.. – knsmith 2014-10-02 17:39:06

+0

無論如何。這與SQL_CALC_FOUND_ROWS問題無關。 – 2014-10-02 17:42:34