2016-05-04 10 views
1

Ich bin ein ziemlich schweres Performance-Problem mit bei einem Vergleich oder zwei Datetime-Spalten in einer MySQL-Tabelle zu manipulieren. Ich habe eine Tabelle tbl, die etwa 10 Millionen Zeilen hat. Es sieht etwa so aus:MySQL scheint Index auf Datetime-Spalte zu ignorieren

`id` int(11) NOT NULL AUTO_INCREMENT, 
`last_interaction` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', 
`last_maintenence` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', 
PRIMARY KEY (`id`), 
KEY `last_maintenence_idx` (`last_maintenence`), 
KEY `last_interaction_idx` (`last_interaction`), 
ENGINE=InnoDB AUTO_INCREMENT=12389814 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

Wenn ich diese Abfrage ausführen, dauert es etwa eine Minute auszuführen:

SELECT id FROM tbl 
WHERE last_maintenence < last_interaction 
ORDER BY last_maintenence ASC LIMIT 200; 

die Abfrage beschreiben dies macht:

  id: 1 
    select_type: SIMPLE 
     table: tbl 
     type: index 
possible_keys: NULL 
      key: last_maintenence_idx 
     key_len: 5 
      ref: NULL 
     rows: 200 
     Extra: Using where 

Es sieht aus wie MySQL findet/verwendet den Index last_interaction nicht. Weiß jemand, warum das so sein könnte und wie man es auslöst?

Antwort

1

Das liegt daran, dass mysql normalerweise nur ein Index der Tabelle verwendet. Leider sieht Ihre Abfrage jedoch einfach aus. Die Lösung wäre, einen zusammengesetzten Index zu erstellen, der beide Spalten umfasst.

+0

Danke nett für die richtige Antwort. – Matt

+0

froh, geholfen zu haben. – e4c5

1

Die Abfrage, die Sie zur Verfügung stellen muss, einen vollständigen Table-Scan. Jeder Datensatz muss überprüft werden, damit er dem Kriterium last_maintenence < last_interaction entspricht. So wird kein Index bei der Suche verwendet.

Der Index last_maintenence_idx wird nur verwendet, weil Sie die Ergebnisse, indem sie es bestellt werden soll.

1

Das ist einfach: Fehler Nein 1.

MySQL nur kann (meistens) einen Index pro Abfrage verwenden und das Optimierungsprogramm sieht, die man für die Verwendung der besser ist.

So müssen Sie einen zusammengesetzten Index mit beiden Feldern erstellen.

+0

Vielen Dank für die richtige Antwort. Ich habe Sie aufgestockt, aber e4c5 als richtige Antwort akzeptiert, weil er der Erste war. – Matt

Verwandte Themen