当我们的表记录少于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
如何改善查询?
答案 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
只能有一行,因此连接不会增加行数。所以加入这个联盟真的没有用。