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