MySQL查询消耗了系统CPU的过多处理器时间

时间:2012-11-05 17:51:49

标签: mysql sql

我有以下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

1 个答案:

答案 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