SELECT SQL_CALC_FOUND_ROWS查询非常慢于250000条记录

时间:2014-10-02 15:06:22

标签: php mysql

当我们的表记录少于150K时,此查询工作正常,但由于它不能正常工作。非常慢 -

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

如何改善查询?

1 个答案:

答案 0 :(得分:2)

此博客中有一个很好的描述: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_members中每行main_articles只能有一行,因此连接不会增加行数。所以加入这个联盟真的没有用。