我有以下MySQL查询,这似乎消耗了系统CPU的大量处理器时间。
该查询假设获取上周评论数量最多的新闻:
$timeago = strtotime("-1 week");
$query = "SELECT * ,
news.id,
news.title,
news.state,
news.date,
COUNT(comments.module_id) as comments_count,
comments.module,
comments.state
FROM news
LEFT OUTER JOIN comments on comments.module_id = news.id AND comments.module = 'news' AND comments.state = '1'
WHERE news.state = '2'
GROUP BY news.id, news.title, news.date
ORDER BY news.date >= $timeago DESC, comments_count DESC limit 6";
$result = mysql_query($query) or die (mysql_error());
$data = mysql_fetch_assoc($result);
查询服务器我恰到好处,它排序了上周评论数量最多的新闻。新闻表中有17,290条记录。出于这个原因,我试图找出以对CPU消耗有益的方式修复查询。
欢迎任何建议。
解释计划说
| id | select_type |表|类型| possible_keys |关键| key_len | ref |行|额外
| 1 |简单|新闻| ref |州|州| 4 | const | 17282 |用在哪里;使用临时;使用filesort
| 1 |简单|评论| ref | module_id | module_id | 101 | saidasea_v2.news.id,const,const | 4
答案 0 :(得分:1)
尝试将您的查询更改为:
SELECT * ,
news.id,
news.title,
news.state,
news.date,
COUNT(comments.module_id) as comments_count,
comments.module,
comments.state
FROM news
LEFT OUTER JOIN comments on comments.module_id = news.id
WHERE news.state = '2'
AND comments.module = 'news' AND comments.state = '1'
GROUP BY news.id, news.title, news.date
ORDER BY news.date >= $timeago DESC, comments_count DESC limit 6
此外,如果您只需要对其发表评论的新闻,请使用inner join
代替left outer join
。