SQL: malbona agado malgraŭ indekso

Mi ĵus alfrontis la sekvan rendimentan problemon de SQL-datumbazo: En SQL-tabelo nomata "uzantoj" kun ĉirkaŭ 1,000,000 da eniroj, necesis neakcepteblaj 28 sekundoj por determini la nombron de aliĝoj hodiaŭ. La horoj de la aliĝoj estis konservitaj en la formato "Ymd H: i: s" en la kolumno "kreita".


La uzata demando

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

kondukis al ĉi tiu ŝarĝa tempo, kvankam jam estis indekso en la "kreita" kolumno de la formato DATETIME

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

estis starigita. La kialo de la malbona agado estas la funkcio alvoko de DATE: La indeksita kolumno "kreita" estas sendita de la funkcio DATE kaj faras la indekson senefika. La Demanda Optimigilo nur scias "kreita", sed ne la rezulto de DATE (kreita). La optimumigita konsulto

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

kondukas al la dezirata rezulto en tempo de 0,4 sekundoj.

Reen