2010-11-20 5 views
8

c'est ma structure date-heure de base:Comment optimiser la recherche d'heure dans 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 

Et je veux obtenir le résultat de la day(date_time) à '2010-10' et la user_id = '1'; My SQL est:

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

mais l'affichage du code EXPLAIN :

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

donc, cette ligne de code ne semble pas être très efficace. Comment pourrais-je construire la table pour rendre ma recherche plus efficace?

Merci beaucoup !!

Répondre

12

L'utilisation d'une fonction sur une colonne dans une clause WHERE empêche l'utilisation efficace d'un index sur cette colonne. Essayez ceci:

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

Ajouter un index sur (user_id, date).

+1

Je suis nouveau à mysql. Donc, je ne suis pas sûr de quel genre d'index devrais-je ajouter? Je pense que j'avais fait index sur eux: INDEX 'date' (' date', 'user_id') – qinHaiXiang

+0

Vous le voulez l'inverse car' user_id' est une valeur "statique", comme 'date' est passé à une fonction . – Danosaure

+0

Voir https://dba.stackexchange.com/a/140693/39319 où l'utilisateur explique mieux comment couvrir toutes les dates et heures si vous êtes préoccupé par les transactions de minuit –

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

efficace et accepte également l'indexation.

0

Que diriez-vous:

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

Ou peut-être

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

Serait-ce trop inefficace?

+1

C'est exactement la même chose que DATE (datatime), qui dans effet annule l'index –