Tocmai m-am confruntat cu următoarea problemă de performanță a unei baze de date SQL: Într-un tabel SQL numit „utilizatori” cu aproximativ 1.000.000 de intrări, determinarea numărului de înregistrări de azi a durat inacceptabil 28 de secunde. Orele înregistrărilor au fost salvate în formatul „Ymd H: i: s” în coloana „creat”.
Interogarea utilizată
SELECT COUNT(ID) FROM users WHERE DATE(created) = '2014-12-21';
a dus la acest timp de încărcare, deși exista deja un index în coloana „creată” a formatului DATETIME
ALTER TABLE `users` ADD INDEX `created` (`created`);
fusese stabilit. Motivul performanței slabe este apelul funcției DATE: Coloana indexată „creată” este trimisă de funcția DATE și face indexul ineficient. Instrumentul de optimizare a interogărilor știe doar „creat”, dar nu rezultatul din DATE (creat). Interogarea optimizată
SELECT COUNT(ID) FROM users WHERE created BETWEEN '2014-12-21' AND '2014-12-21 23:59:59';
duce la rezultatul dorit într-un timp de 0,4 secunde.