NUNCA use um seletor como DATE(datecolumns) = '2012-12-24'
esse - é um ótimo desempenho:
- calculará
DATE()
para todas as linhas, incluindo aquelas que não correspondem
- tornará impossível usar um índice para a consulta
É muito mais rápido usar
SELECT * FROM tablename
WHERE columname BETWEEN '2012-12-25 00:00:00' AND '2012-12-25 23:59:59'
pois isso permitirá o uso do índice sem cálculo.
EDITAR
Como apontado por Used_By_Already, desde a resposta inicial em 2012, surgiram versões do MySQL, nas quais usar '23: 59: 59 'como final do dia não é mais seguro. Uma versão atualizada deve ler
SELECT * FROM tablename
WHERE columname >='2012-12-25 00:00:00'
AND columname <'2012-12-26 00:00:00'
A essência da resposta, ou seja, evitar um seletor em uma expressão calculada, é claro, ainda permanece.