NUNCA use un selector como DATE(datecolumns) = '2012-12-24'
: es un asesino de rendimiento:
- calculará
DATE()
para todas las filas, incluidas aquellas que no coinciden
- hará que sea imposible usar un índice para la consulta
Es mucho más rápido de usar
SELECT * FROM tablename
WHERE columname BETWEEN '2012-12-25 00:00:00' AND '2012-12-25 23:59:59'
ya que esto permitirá el uso del índice sin cálculo.
EDITAR
Como señaló Used_By_Already, en el tiempo transcurrido desde la respuesta inicial en 2012, han surgido versiones de MySQL, donde usar '23: 59: 59 'como fin de día ya no es seguro. Una versión actualizada debería leer
SELECT * FROM tablename
WHERE columname >='2012-12-25 00:00:00'
AND columname <'2012-12-26 00:00:00'
La esencia de la respuesta, es decir, la evitación de un selector en una expresión calculada, por supuesto, sigue en pie.