2010-11-20 20 views
8

questa è la mia base struttura di data e ora:Come ottimizzare la ricerca di data e ora in 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 

e voglio ottenere il risultato del day(date_time) a '2010-10' e la user_id = '1'; My SQL è:

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

ma il display EXPLAIN codice :

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

quindi, questa riga di codice non sembra per essere molto efficace.Come potrei costruire il tavolo per rendere più efficace la mia ricerca ??

Grazie mille !!

risposta

12

L'utilizzo di una funzione su una colonna in una clausola WHERE impedisce l'utilizzo efficiente di un indice su tale colonna. Prova a modificare:

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

aggiungere un indice sulla (user_id, date).

+1

Sono nuovo di mysql. Quindi non sono sicuro di quale tipo di indice dovrei aggiungere? Penso di aver fatto un indice su di loro: INDICE 'date' (' date', 'user_id') – qinHaiXiang

+0

Si desidera il contrario, dato che' user_id' è un valore "statico", dato che 'date' viene passato a una funzione . – Danosaure

+0

Vedere https://dba.stackexchange.com/a/140693/39319 dove l'utente spiega meglio come coprire tutti i periodi di data e ora se si è preoccupati per le transazioni di mezzanotte –

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

efficiente e accetta anche l'indicizzazione.

0

ne dite:

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

O forse

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

Vorrei che sia troppo inefficiente?

+1

Questo è proprio come DATE (datatime), che in effetto annulla l'indice –