Попробуйте использовать сравнение диапазона вместо прямого равенства. Другими словами, переписать запрос в
SELECT username, COUNT(*) AS TotalUser
FROM table
WHERE CheckDate BETWEEN CURDATE() AND ADDDATE(CURDATE(), INTERVAL 1 DAY)
или, возможно,
SELECT username, COUNT(*) AS TotalUser
FROM table
WHERE CheckDate >= CURDATE() AND
CheckDate < ADDDATE(CURDATE(), INTERVAL 1 DAY)
Смотрите, если это помогает.
EDIT: Или первый запрос может быть переработан в
SELECT username, COUNT(*) AS TotalUser
FROM table
WHERE CheckDate BETWEEN CURDATE() AND
ADDDATE(ADDDATE(CURDATE(), INTERVAL 1 DAY), INTERVAL -1 SECOND)
но начинает становиться довольно уродливыми, и я не уверен, что отрицательные числа допускаются в ИНТЕРВАЛЬНЫХ спецификаторах.
В любом случае, если вы обнаружите, что хотите усечь дату, чтобы увидеть, совпадает ли она с какой-либо другой датой, лучшим вариантом является использование дальнего сравнения. В более общем плане, старайтесь избегать использования функций в значениях столбцов в предложении WHERE, если есть способ избежать этого.
Делитесь и наслаждайтесь.
Это единственный вопрос, который медленный? как насчет других запросов, возвращающих почти такой же объем данных? каково текущее время отклика? – Bhushan
Вы должны запустить функцию 'DATE' на каждом столбце' CheckDate', после чего вам нужно проверить, что соответствует 'CURDATE()'. Это 400 000 дат, которые обрабатываются, а затем (без индекса) по сравнению со стоимостью. Неэффективное использование функций 'DATE' /' CURDATE'. –
@Bhushan Я обновил запрос. Потребуется около 3 секунд, чтобы получить результат даже при обнаружении только одной записи. –