php - SELECT SQL_CALC_FOUND_ROWS 查询超过 250000 条记录非常慢

标签 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

如何改进我的查询?

最佳答案

这个博客中有一个很好的描述: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/

相关文章:

php - 检查多行 - PHP 和 MySQL

php - WordPress - WPDB 查询

java - Android - 将行插入 SQLite DB

c# - 使用 MySqlCommandBuilder 时更新 datagridview 中的时间值时日期值发生变化

php - 特定数组键的返回值

php - 在 PHP 中从 MySQL 表创建多维数组树

javascript - 停止输入提交表单 - 得到奇怪的结果

Mysql基于时间引用分区

mysql选择值按顺序排列的记录

mysql - CodeIgniter- 事件记录插入新的或更新重复