私は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');
次に、クエリ間の問題は何ですか?これを効率化するために必要な変更は何ですか?
「PRIMARY KEY」はありません。 –
最初のKEYと3番目のKEYは冗長です。最初のものを取り除く。 –