2009-03-02 8 views
1

Je voudrais accélérer une requête MySQL qui récupèrent essentiellement une page de données suivant le motif ci-dessousRécupération de page rapide dans MySQL, utilisation de l'index?

select 
my_field_A, 
my_field_B 
where 
time_id >= UNIX_TIMESTAMP('1901-01-01 00:00:00') AND 
time_id < UNIX_TIMESTAMP('2009-01-16 00:00:00') 

Le champ time_id est un index MySQL, mais, la requête se comporte comme si a été lu la base de données entière à chaque requête (récupérer quelques lignes étant déjà assez lent). Je ne suis pas un expert en MySQL. Quelqu'un peut-il deviner ce que je fais mal?

+0

"time_id est censé être un index MySQL" mais êtes-vous sûr qu'il l'est? 'Afficher les index de [table]' – jonstjohn

Répondre

3

Assurez-vous que vous avez un index (B-tree) sur TIME_ID, cela devrait être efficace pour les requêtes de gamme. Assurez-vous également que time_id est dans le format d'heure approprié.

Si vous voulez vraiment comprendre ce que fait mysql, vous pouvez ajouter le mot clé 'explain' en face de la requête et l'exécuter dans votre client mysql. Cela montrera quelques informations sur ce que mysql fait et quel genre d'analyses sont effectuées.

http://dev.mysql.com/doc/refman/5.0/en/using-explain.html

1

Comme il y a probablement beaucoup de time_id répondant à ces critères, MySQL peut penser que l'analyse de table complète est meilleure.

Essayez de forcer l'index:

SELECT 
my_field_A, 
my_field_B 
FROM mytable FORCE INDEX (index_name_on_time_id) 
WHERE 
time_id >= UNIX_TIMESTAMP('1901-01-01 00:00:00') AND 
time_id < UNIX_TIMESTAMP('2009-01-16 00:00:00') 
0

Avez-vous besoin de la gamme inférieure? Y a-t-il des entrées antérieures à 1901? Comment la colonne time_id est-elle générée? Si le TIME_ID est toujours plus à chaque nouvelle entrée ajoutée dans DB, vous voudrez peut-être envisager de trouver ID avec le plus proche de l'entrée 2009-01-16 puis sélectionnez par ID

select my_field_A, my_field_B 
FROM 
    mytable 
WHERE 
    id <= ? 

Si ce n'est pas le cas, essayez de vérifier le partitionnement disponible depuis MySQL 5.1 et décomposer la table par années, cela devrait augmenter la vitesse de façon spectaculaire.