SQL: Schlechte Performance trotz Index

Eben war ich mit folgendem Performance-Problem einer SQL-Datenbank konfrontiert: In einer SQL-Tabelle namens „users“ mit ~1.000.000 Einträgen benötigte die Ermittlung der Anzahl der Registrierungen am heutigen Tag untragbare 28 Sekunden. In der Spalte „created“ waren die Zeitpunkte der Registrierungen im Format „Y-m-d H:i:s“ gespeichert.


Das verwendete Query

SELECT COUNT(ID) FROM users WHERE DATE(created) = '2014-12-21';

führte zu dieser Ladezeit, obwohl auf der Spalte „created“ vom Format DATETIME bereits ein Index mit

ALTER TABLE `users` ADD INDEX `created` (`created`);

gesetzt worden war. Der Grund für die schwache Performance liegt am Funktionsaufruf von DATE: Die indizierte Spalte „created“ wird durch die Funktion DATE geschickt und macht den Index wirkungslos. Der Query Optimizer kennt nur „created“, nicht aber das Ergebnis von DATE(created). Das optimierte Query

SELECT COUNT(ID) FROM users WHERE created BETWEEN '2014-12-21' AND '2014-12-21 23:59:59';

führt zum gewünschten Ergebnis in einer Zeit von 0.4 Sekunden.

Zurück