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の消費に適した方法でクエリを修正する方法を模索しています。

任意の提案を歓迎します。

説明計画は言う

| id | select_type | テーブル| タイプ| possible_keys | キー| key_len | ref | 行| 追加

| 1 | シンプル| ニュース| ref | 状態| 状態| 4 | const | 17282 | whereを使用する; 一時的な使用; filesortの使用

| 1 | シンプル| コメント| ref | module_id | module_id | 101 | saidasea_v2.news.id、const、const | 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 に答える