2010-11-20 17 views
8

este es mi estructura de fecha-hora básica:¿Cómo optimizar la búsqueda de fecha y hora en Mysql?

primary key(datetime)   key 
auot_id date_time    user_id 
1  2010-10-01 20:32:34 1 
2  2010-10-02 20:32:34 1 
3  2010-11-03 20:32:34 2 
4  2010-10-04 20:32:34 1 
5  2010-11-05 20:32:34 1 

y quiero obtener el resultado de la day(date_time) en '2010-10' y la user_id = '1'; My SQL es:

SELECT * FROM datetime WHERE user_id = 1 AND DATE_FORMAT(date,'%Y-%m') = '2010-10' 

pero la pantalla EXPLAIN código :

SIMPLE datetime ALL (NULL) (NULL) (NULL) (NULL) 5 Using where 

Por lo tanto, esta línea de código no parece para ser muy eficaz. ¿Cómo podría construir la tabla para hacer que mi búsqueda sea más efectiva?

Muchas gracias !!

Respuesta

12

El uso de una función en una columna en una cláusula WHERE impide el uso eficiente de un índice en esa columna. Tal vez puedas probar:

SELECT * 
FROM `datetime` 
WHERE user_id = 1 
AND `date` >= '2010-10-01' AND `date` < '2010-11-01' 

añadir un índice en (user_id, date).

+1

Soy nuevo en mysql. Entonces, no estoy seguro de qué tipo de índice debo agregar? Creo que había hecho un índice sobre ellos: INDEX 'date' (' date', 'user_id') – qinHaiXiang

+0

Lo quiere al revés, ya que' user_id' es un valor "estático", como 'date' se pasa a una función . – Danosaure

+0

Consulte https://dba.stackexchange.com/a/140693/39319 donde el usuario explica mejor cómo cubrir todos los períodos de fecha y hora si le preocupan las transacciones a medianoche –

2
SELECT * 
FROM yourTable 
WHERE datatime 
BETWEEN '2010-10-01' AND '2010-11-01' 

eficiente y acepta la indexación también.

0

¿Qué tal:

WHERE CAST(datatime AS DATE) = '2010-10-01' 

O quizás

WHERE CAST(datatime AS DATE) = CAST('2010-10-01' AS DATE) 

¿Sería demasiado ineficiente?

+1

Esto es exactamente lo mismo que DATE (datatime), que en efecto anula el índice –