Ich habe eine Tabelle mit insgesamt 4 Millionen Zeilen.Schmerzhaft langsam MySQL-Abfrage mit indizierten Spalten
Wenn ich die folgende Abfrage ausführen, dauert es 40 Sekunden
SELECT * FROM `traffic`
WHERE `callstart_timestamp` >= '2016-09-01 00:00:00'
AND `callend_timestamp` <= '2016-09-18 00:00:00'
AND app = 'XXXX'
416040 insgesamt abgeschlossen ist, nahm Abfrage 40,0631 Sekunden.
Wenn ich die Bedingung AND app = 'XXXX'
aus der Abfrage entfernen, wird es in weniger als einer Sekunde beendet.
Können Sie uns bitte mitteilen, was das Problem verursachen könnte, da alle Spalten indiziert sind?
Abfrage ERKLÄREN:
SIMPLE; traffic; NULL; ref; app,callend_timestamp,callstart_timestamp; app; 22; const; 1976467; 12.13; Using where;
CREATE:
CREATE TABLE `traffic` (
`id` varchar(20) NOT NULL,
`user_cli` varchar(15) NOT NULL,
`ddi` varchar(15) DEFAULT NULL,
`callstart_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`callend_timestamp` timestamp NULL DEFAULT NULL,
`app` varchar(20) NOT NULL,
`lang` char(2) NOT NULL DEFAULT 'en'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `traffic`
ADD PRIMARY KEY (`id`),
ADD KEY `app` (`app`),
ADD KEY `callend_timestamp` (`callend_timestamp`),
ADD KEY `callstart_timestamp` (`callstart_timestamp`),
ADD KEY `ddi` (`ddi`);
UPDATE:
Ich habe einige der Antworten umgesetzt unten und sie hat mir sehr geholfen! Ich werde versuchen herauszufinden, welche Antwort besser zu meinem Fall passt. Ich werde mit den Ergebnissen aktualisieren.
nur neugierig, Was passiert, wenn Sie die Verwendung von Index auf "App" deaktivieren? d. h., es treibt Daten statt "app" –
Nur ein Vorschlag: Verschieben Sie die App in eine andere Tabelle und Referenz mit Fremdschlüssel. Dann filtern Sie einfach nach dem Primärschlüssel der App. Dies ist besonders praktisch, wenn dieselbe App varchar in vielen Zeilen verwendet wird. – drodil