2

我有以下 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 消耗有益的方式来修复查询。

欢迎大家提出意见。

解释计划说

| 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外的

| 1 | 简单 | 新闻 | 参考 | 状态 | 状态 | 4 | 常量 | 17282 | 使用哪里;使用临时的;使用文件排序

| 1 | 简单 | 评论 | 参考 | 模块 ID | 模块 ID | 101 | sayasea_v2.news.id,常量,常量 | 4

4

1 回答 1

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.

于 2012-11-05T18:25:37.483 回答