SQL: prestazioni scadenti nonostante index

Mi sono appena confrontato con il seguente problema di prestazioni di un database SQL: in una tabella SQL chiamata "utenti" con ~ 1.000.000 di voci, sono stati necessari 28 secondi inaccettabili per determinare il numero di registrazioni odierne. Gli orari delle registrazioni sono stati salvati nel formato “Ymd H: i: s” nella colonna “creato”.


La query utilizzata

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

ha portato a questo tempo di caricamento, sebbene fosse già presente un indice nella colonna "creato" del formato DATETIME

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

era stato impostato. Il motivo delle scarse prestazioni è la chiamata alla funzione DATE: La colonna indicizzata "creata" viene inviata dalla funzione DATE e rende l'indice inefficace. Query Optimizer conosce solo "creato", ma non il risultato di DATE (creato). La query ottimizzata

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

porta al risultato desiderato in un tempo di 0,4 secondi.

Indietro