SQL: performanță slabă în ciuda indexului

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.

Înapoi