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.