Я только что столкнулся со следующей проблемой производительности базы данных SQL: в таблице SQL под названием «пользователи» с ~ 1 000 000 записей потребовалось недопустимо 28 секунд, чтобы определить количество сегодняшних регистраций. Время регистраций было сохранено в формате «Ymd H: i: s» в столбце «создано».
Используемый запрос
SELECT COUNT(ID) FROM users WHERE DATE(created) = '2014-12-21';
привело к этому времени загрузки, хотя в столбце "created" формата DATETIME уже был индекс.
ALTER TABLE `users` ADD INDEX `created` (`created`);
был установлен. Причина низкой производительности - вызов функции DATE: индексированный столбец «created» отправляется функцией DATE и делает индекс неэффективным. Оптимизатору запросов известно только «создано», но не результат DATE (created). Оптимизированный запрос
SELECT COUNT(ID) FROM users WHERE created BETWEEN '2014-12-21' AND '2014-12-21 23:59:59';
приводит к желаемому результату за время 0,4 секунды.