2 votes

Pourquoi les temps d'exécution de ces deux requêtes MySQL (similaires ?) varient-ils autant ?

J'ai les tableaux players , players_to_teams et accounts . players_to_teams a un FK pour players y accounts . players a un FirstName y accounts a un Name . Les deux sites FirstName y Name sont indexés.

Running

SELECT players_to_teams.id
FROM players_to_teams
INNER JOIN players
ON players.id = players_to_teams.player_id
ORDER BY players.FirstName

s'exécute en 0,004 seconde.

SELECT players_to_teams.id
FROM players_to_teams
INNER JOIN accounts
ON accounts.id = players_to_teams.account_id
ORDER BY accounts.Name

s'exécute en plus de 7 secondes.

Il y a 30 000 enregistrements de comptes et 250 000 enregistrements de joueurs.

EXPLAIN peuvent être trouvés ici : https://gist.github.com/2368906

Ces requêtes ne devraient-elles pas s'exécuter dans des espaces temps similaires ?

1voto

DRapp Points 23901

Une autre option qui pourrait aider... que je me souviens avoir lu quelque part... Si vous avez un index à la fois sur l'ID du compte et sur le nom en tant qu'index unique (id, nom), alors le moteur n'a pas besoin de revenir aux enregistrements de données brutes pour extraire la valeur du nom et peut la tirer directement de l'index... ce qui permet de gagner du temps par rapport à une lecture complète des enregistrements sur les correspondances.

1voto

TheVedge Points 1879

Votre requête la plus lente nécessite une table temporaire pour trier le jeu de résultats, tandis que l'autre peut utiliser l'index sur FirstName, évitant ainsi tout tri. (Extra : Utilisation d'un index ; Utilisation d'une table temporaire ; Utilisation de filesort)

Pouvez-vous essayer de forcer l'index sur les comptes pour voir si vous pouvez être plus malin que l'optimisé ?

SELECT players_to_teams.id
FROM players_to_teams 
INNER JOIN accounts FORCE INDEX(Name)
ON accounts.id = players_to_teams.account_id
ORDER BY accounts.Name

Une autre alternative serait de réécrire la requête avec une jointure directe, et d'avoir la table des comptes listée en premier.

Je n'ai pas de bonne réponse quant à la raison pour laquelle il choisit actuellement les joueurs_to_teams en premier alors que les comptes ont beaucoup moins de lignes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X