当我们的表记录少于 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
如何改进我的查询?
最佳答案
这个博客中有一个很好的描述: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
中只能有一行,因此连接不会增加行要么。所以做这个连接真的没有任何意义。
关于php - SELECT SQL_CALC_FOUND_ROWS 查询超过 250000 条记录非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26163821/