1

このクエリで困惑し、約 213k 行を含む重要なテーブルを検索します。クエリの目的は、1 か月間のトラフィック データをレポートすることです。その月の各日のトラフィック量。そして、各日の 10 進値の合計。このクエリは頻繁に実行されるため、可能な限り最適化する必要があります。現在、平均を取ります。2秒..

SQL フィドル: http://sqlfiddle.com/#!2/171f5/3/0

すべての提案は大歓迎です! ありがとうございました。

クエリ:

SELECT `date_day`, COUNT(*) AS num, SUM(decval) AS sum_decval FROM (`tbl_traffic`)
WHERE `uuid` = '1' AND `date_year` = '2012' AND `date_month` = '11'
GROUP BY `date_day`;

結果の説明:

id: 1
select_type: SIMPLE
table: adb1_analytics
type: ref
possible_keys: keys1,keys2,keys3
key: keys1
key_len: 7
ref: const,const,const
rows: 106693
Extra: Using where
1 row in set (0.13 sec)

テーブル構造:

CREATE TABLE IF NOT EXISTS `tbl_traffic` (
  `id` int(100) unsigned NOT NULL AUTO_INCREMENT,
  `uuid` int(100) unsigned NOT NULL,
  `country` char(2) CHARACTER SET latin1 DEFAULT NULL,
  `browser` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
  `platform` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
  `referrer` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `decval` decimal(15,5) NOT NULL,
  `date_year` smallint(4) unsigned NOT NULL,
  `date_month` tinyint(2) unsigned NOT NULL,
  `date_day` tinyint(2) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `keys1` (`uuid`,`date_year`,`date_month`,`date_day`),
  KEY `keys2` (`date_year`,`date_month`,`referrer`),
  KEY `keys3` (`date_year`,`date_month`,`country`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
4

3 に答える 3

1

に有効なインデックスがありませんdate_day

フェッチして計算するもの専用のキーを作成することをお勧めします。(date_day, decval)

于 2012-11-14T22:49:35.553 に答える
0

「グループ化」を行うときはいつでも、テーブル全体のスキャンを要求しています。

http://dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html

より適切にインデックスを作成できない場合(@njkの回答を参照)、特定の値を選択してから、サブセットでグループ化、合計などを行うことができます。他に何もないとしても、少なくともソートするセットは小さくなります。

于 2012-11-14T22:52:25.220 に答える
0

count(id) を使用して、date_day と decval にキーを追加します。両方のフィールドをカバーするキーはさらに良いかもしれません

于 2012-11-14T23:00:20.770 に答える