次の構造の分析テーブル(500万行以上)があります
Hits
id int() NOT NULL AUTO_INCREMENT,
hit_date datetime NOT NULL,
hit_day int(11) DEFAULT NULL,
gender varchar(255) DEFAULT NULL,
age_range_id int(11) DEFAULT NULL,
klout_range_id int(11) DEFAULT NULL,
frequency int(11) DEFAULT NULL,
count int(11) DEFAULT NULL,
location_id int(11) DEFAULT NULL,
source_id int(11) DEFAULT NULL,
target_id int(11) DEFAULT NULL,
テーブルへのほとんどのクエリは、2つの日時の間で特定の列のサブセットをクエリすることであり、それらはすべての行のすべてのカウント列を合計します。例えば:
SELECT target.id,
SUM(CASE gender WHEN 'm' THEN count END) AS 'gender_male',
SUM(CASE gender WHEN 'f' THEN count END) AS 'gender_female',
SUM(CASE age_range_id WHEN 1 THEN count END) AS 'age_18 - 20',
SUM(CASE target_id WHEN 1 then count END) AS 'target_test'
SUM(CASE location_id WHEN 1 then count END) AS 'location_NY'
FROM Hits
WHERE (location_id =1 or location_id = 2)
AND (target_id = 40 OR target_id = 22)
AND cast(hit_date AS date) BETWEEN '2012-5-4'AND '2012-5-10'
GROUP BY target.id
このテーブルへのクエリの興味深い点は、where句にヒット列の名前と値の順列が含まれていることです。これは、これらがフィルタリング対象であるためです。したがって、上記の特定のクエリは、「test」と呼ばれるターゲットに属するニューヨークの18〜20歳の男性と女性の数(age_range_id 1)を取得することです。ただし、8を超える年齢層、10のklout範囲、45の場所、10のソースなどがあります(すべての外部キー参照)。
現在、hot_dateにインデックスがあり、target_idに別のインデックスがあります。このテーブルに適切にインデックスを付けるための最良の方法は何ですか。すべての列フィールドに複合インデックスを設定することは、本質的に間違っているようです。
サブクエリを使用せずにこのクエリを実行してすべてのカウントを合計する他の方法はありますか?私はいくつかの調査を行いましたが、これは必要なデータセットを取得するための最良の方法のようですが、このクエリを処理するためのより効率的な方法はありますか?