2016-07-01 13 views
0

Ich habe eine Tabelle namens survey_results, die Daten über verschiedene Umfragen unter finden Sie Schema dieser Tabelle finden kann.SQL Composite Indizes für zwischen Abfrage

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 

Habe ich nur noch einen neuen Index index_survey_results_on_acc_id_and_surv_id_and_created_and_group für survey_results ich einen Filter auf über vier Dinge ist, warum ich einen neuen Index für diese Tabelle erstellt, Gruppe optional.

Problem:

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') 

obige Abfrage wird mein Index nicht vollständig verwendet wird. Es wird nur für account_id und survey_id verwendet.

Wenn ich Frage wie unten funktioniert es richtig.

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'); 

Dann was ist das Problem mit zwischen Abfrage? Was sind alle Änderungen, um dies effizient zu machen?

+0

Warum kein 'PRIMARY KEY' ?? –

+0

Ihre ersten und dritten KEYs sind redundant; Entferne das erste. –

Antwort

2

Der richtige Index für Ihre Suchanfrage lautet survey_results(account_id, survey_id, group_id, created_at).

Alle Spalten unter Gleichheitsbedingungen sollten zuerst im Index stehen. Dann können Sie einen Schlüssel mit einer Ungleichheitsbedingung hinzufügen, z. B. between.

+0

In meinem Fall ist Group ein optionaler Parameter. Wenn ich die Gruppe nicht verwende, wird der Index nicht richtig sein? Jetzt muss ich einen weiteren Index verwenden? oder irgendeine gute Lösung? –

+0

Es wird den Index für die ersten beiden Spalten verwenden, aber nicht für 'created_at'. –

+0

@ElayarajaT - dann haben Sie auch 'INDEX (account_id, survey_id, created_at)'. Und wenn Sie 'PRIMARY KEY (id)' sagten, würden diese "abdecken" und etwas mehr Leistung hinzufügen. –