Récupération rapide de page dans MySQL, utilisation de l'index?
-
03-07-2019 - |
Question
Je voudrais accélérer une requête MySQL qui permet de récupérer une page de données en suivant le schéma ci-dessous
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. Toutefois, la requête se comporte comme si la base de données entière était lue à chaque requête (l'extraction de quelques lignes étant déjà assez lente). Je ne suis pas un expert en MySQL. Quelqu'un peut-il deviner ce que je fais mal?
La solution
Assurez-vous que vous avez un index (B-tree) sur time_id, cela devrait être efficace pour les requêtes de plage. Assurez-vous également que time_id est au format d'heure approprié.
Si vous voulez vraiment comprendre ce que fait mysql, vous pouvez ajouter le mot clé 'expliquer' en face de la requête et l'exécuter dans votre client mysql. Cela affichera des informations sur ce que fait mysql et le type d’analyses effectuées.
Autres conseils
Comme il y a probablement beaucoup de time_id
dans ces critères, MySQL
peut penser que l'analyse complète du tableau 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')
Avez-vous besoin de la plage 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 supérieur à chaque nouvelle entrée ajoutée dans la base de données, vous pouvez envisager de rechercher un ID avec l'entrée la plus proche de 2009-01-16, puis de sélectionner 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écomposez le tableau par années, cela devrait augmenter considérablement la vitesse.