1

このクエリを最適化する方法はありますか? 2.5秒以上かかります。

SELECT articles.categories_id,
    COUNT(articles.id) AS count
FROM articles
WHERE articles.created >= DATE_SUB(NOW(), INTERVAL 48 HOUR)
GROUP BY articles.categories_id
ORDER BY count DESC

CREATE TABLE IF NOT EXISTS `articles` (
  `id` int(11) NOT NULL,
  `categories_id` int(11) NOT NULL,
  `feeds_id` int(11) NOT NULL DEFAULT '0',
  `users_id` int(11) NOT NULL DEFAULT '1',
  `title` varchar(255) CHARACTER SET utf8 NOT NULL,
  `sefriendly` varchar(255) CHARACTER SET utf8 NOT NULL,
  `body` text CHARACTER SET utf8,
  `source` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `created` datetime NOT NULL,
  `edited` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `fingerprint` varchar(32) CHARACTER SET utf8 NOT NULL,
  `type` int(1) NOT NULL DEFAULT '1' COMMENT '1 => Feed fetched article\n2 => User submitted article',
  `description` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `keywords` text CHARACTER SET utf8,
  `status` int(1) NOT NULL DEFAULT '0' COMMENT '0 => Passive\n1 => Active\n2 => Pending',
  PRIMARY KEY (`id`),
  KEY `categories_id` (`categories_id`) USING BTREE,
  KEY `feeds_id` (`feeds_id`) USING BTREE,
  KEY `users_id` (`users_id`) USING BTREE,
  KEY `fingerprint` (`fingerprint`) USING BTREE,
  KEY `title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci ROW_FORMAT=COMPACT;

すでにキャッシングを使っているので、コード的には問題ありません。

これは SQL の説明の結果です。

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  articles    index   NULL    categories_id   4   NULL    120411  Using where; Using temporary; Using file sort

ありがとう。

4

1 に答える 1

2

にインデックスを追加することで、状況を改善できますcreated。これは、WHERE句を提供するのに役立ちます。

WHERE articles.created >= DATE_SUB(NOW(), INTERVAL 48 HOUR)

(created, categories_id)代わりに、クエリに必要なすべてのデータがインデックスで利用できるように、カバーするインデックスを作成すると有利です。

idCOUNTは値がNULLまたはNOTNULLであるかどうかのみidを考慮しますが、テーブル定義ではNOT NULLとして定義されているため、このクエリではの値は必要ありません。同じ結果が得られることが保証されているため、COUNT(*)またはCOUNT(1)の代わりにを使用してこれを明示的にすることをお勧めします。COUNT(id)しかし、MySQLは、この最適化を自動的に行うのに十分インテリジェントであると期待しています。

集計の結果でソートしているため、ファイルのソートを回避できないと思います。これはインデックス付けできません。

于 2012-04-28T21:40:19.487 に答える