SQL: performances médiocres malgré l'index

Je viens d'être confronté au problème de performance suivant d'une base de données SQL: Dans une table SQL appelée "users" avec ~ 1 000 000 entrées, il a fallu 28 secondes inacceptables pour déterminer le nombre d'enregistrements aujourd'hui. Les heures des inscriptions ont été sauvegardées au format «Ymd H: i: s» dans la colonne «créé».


La requête utilisée

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

a conduit à ce temps de chargement, bien qu'il y ait déjà un index dans la colonne "créé" du format DATETIME

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

avait été fixé. La raison de la mauvaise performance est l'appel de fonction de DATE: la colonne indexée «créée» est envoyée par la fonction DATE et rend l'index inefficace. L'optimiseur de requêtes ne connaît que «créé», mais pas le résultat de DATE (créé). La requête optimisée

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

conduit au résultat souhaité en un temps de 0,4 seconde.

Retour