2016-07-01 11 views
0

私はsurvey_resultsというテーブルを持っています。このテーブルは、下のさまざまな調査に関するデータを保持しています。そのテーブルのスキーマを見つけることができます。クエリ間のSQLコンポジットインデックス

CREATE TABLE `survey_results` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `account_id` bigint(20) DEFAULT NULL, 
    `survey_id` bigint(20) DEFAULT NULL, 
    `customer_id` bigint(20) DEFAULT NULL, 
    `agent_id` bigint(20) DEFAULT NULL, 
    `created_at` datetime DEFAULT NULL, 
    `updated_at` datetime DEFAULT NULL, 
    `group_id` bigint(20) DEFAULT NULL, 
    KEY `nameindex_on_account_id_and_survey_id` (`account_id`,`survey_id`), 
    KEY `survey_results_id` (`id`), 
    KEY `index_survey_results_on_acc_id_and_surv_id_and_created_and_group` (`account_id`,`survey_id`,`created_at`,`group_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 

は、私はちょうど私が私がこのテーブルに新しいインデックスを作成した理由thatsの4つの物事以上にフィルタを持ってsurvey_resultsための新しいインデックスindex_survey_results_on_acc_id_and_surv_id_and_created_and_groupを追加し、グループはオプションです。

問題:クエリの上

EXPLAIN SELECT `survey_results`.id 
FROM `survey_results` 
WHERE `survey_results`.`account_id` = 1 AND 
     `survey_results`.`survey_id` = 14 AND 
     (survey_results.created_at between '2016-05-31 18:30:00' and '2016-07-01 18:29:59') AND 
     (survey_results.group_id = '4') 

完全に私のインデックスを使用していません。 account_idとsurvey_idにのみ使用されます。

以下のようにクエリが正しく動作していれば

EXPLAIN SELECT id FROM `survey_results` WHERE `account_id` = 1 AND `survey_id` = 14 AND (survey_results.created_at = '2016-06-30 17:22:24') AND (survey_results.group_id = '4'); 

次に、クエリ間の問題は何ですか?これを効率化するために必要な変更は何ですか?

+0

「PRIMARY KEY」はありません。 –

+0

最初のKEYと3番目のKEYは冗長です。最初のものを取り除く。 –

答えて

2

クエリの正しいインデックスはsurvey_results(account_id, survey_id, group_id, created_at)です。

等価条件のすべての列は、最初にインデックスに挿入する必要があります。次に、betweenのように、不等号条件付きの1つのキーを追加できます。

+0

私の場合、Groupはオプションのパラメータです。私がグループを使用しなかった場合、それはそのインデックスを正しく取ることはありませんか?もう1つのインデックスを使用する必要がありますか?または任意の良い解決策? –

+0

最初の2つのカラムはインデックスを使用しますが、 'created_at'は使用しません。 –

+0

@ElayarajaT - また、 'INDEX(account_id、survey_id、created_at)'も持っています。そして、もしあなたが 'PRIMARY KEY(id)'と言っていたら、これらは "カバーする"ことになり、より多くのパフォーマンスが追加されます。 –

関連する問題