次の構造のテーブルがあります
CREATE TABLE rel_score (
user_id bigint(20) NOT NULL DEFAULT '0',
score_date date NOT NULL,
rel_score decimal(4,2) DEFAULT NULL,
doc_count int(8) NOT NULL
total_doc_count int(8) NOT NULL
PRIMARY KEY (user_id,score_date),
KEY SCORE_DT_IDX (score_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=1
テーブルには、2000 年 1 月 1 日から日付まで毎日、アプリケーション内のすべてのユーザーの rel_score 値が格納されます。合計レコード数は 7 億を超えると見積もっています。テーブルに 6 か月分のデータ (約 3,000 万行) を入力したところ、クエリの応答時間は約 8 分でした。ここに私の質問があります、
select
user_id, max(rel_score) as max_rel_score
from
rel_score
where score_date between '2012-01-01' and '2012-06-30'
group by user_id
order by max_rel_score desc;
次の手法を使用してクエリを最適化しようとしましたが、
- score_date 列でのパーティショニング
- score_date 列にインデックスを追加する
クエリの応答時間はわずかに改善され、8 分弱になりました。
応答時間を改善するにはどうすればよいですか? テーブルのデザインは適切ですか?
また、ユーザーはデータ範囲全体に対してクエリを実行できるため、古いデータをアーカイブに移動することはできません。