98 votes

Quand utiliser STRAIGHT_JOIN avec MySQL

J'ai juste eu un assez requête complexe à mon travail, et c'était la prise de 8 secondes pour s'exécuter. EXPLIQUER montrant un étrange tableau de l'ordre et de mon index n'ont pas été tous utilisés en même avec l'INDICE de FORCE de rappel. Je suis tombé sur le STRAIGHT_JOIN joindre mot-clé et ont commencé à remplacer certains de mes JOINTURE INTERNE avec les mots-clés. J'ai remarqué considérable amélioration de la vitesse. Finalement, j'ai juste remplacé tous mes JOINTURE INTERNE avec les mots-clés STRAIGHT_JOIN pour cette question, et il fonctionne maintenant dans .01 secondes.

Ma question est de savoir quand utilisez-vous STRAIGHT_JOIN et de le faire lorsque vous utilisez une JOINTURE INTERNE? Est-il une raison de ne pas utiliser STRAIGHT_JOIN si vous êtes à la rédaction d'un bon de requêtes?

74voto

nathan Points 2755

Je ne recommande pas d'utiliser STRAIGHT_JOIN sans une bonne raison. Ma propre expérience est que la requête MySQL optimiseur choisit un mauvais plan de requête plus souvent que je le voudrais, mais pas assez souvent que vous devriez juste de le contourner en général, qui est ce que vous seriez si vous avez toujours utilisé STRAIGHT_JOIN.

Ma recommandation est de laisser toutes les requêtes ordinaires des Jointures. Si vous découvrez que l'une requête à l'aide d'un sous-optimal du plan de requête, je vous suggère d'abord d'essayer de réécrire ou de re-structure de la requête un peu pour voir si l'optimiseur va alors choisir un meilleur plan de requête. Aussi, pour innodb au moins, assurez-vous qu'il n'est pas juste que votre indice de statistiques sont out-of-date (ANALYSER la TABLE). Que peut provoquer l'optimiseur de choisir un mauvais plan de requête. Indicateurs de l'optimiseur doit généralement être votre dernier recours.

Une autre raison de ne pas utiliser les indicateurs de requête, c'est que votre distribution de données peuvent changer au fil du temps, ou votre indice de sélectivité peut changer, etc. que votre table grandit. Vos indicateurs de requête qui sont optimales, pourrait devenir sous-optimale dans le temps. Mais l'optimiseur seront incapables de s'adapter le plan de requête en raison de votre dépassées conseils. Vous restez plus souple si vous permettez à l'optimiseur de prendre les décisions.

24voto

jjclarkson Points 3370

De la référence MySQL JOIN :

"STRAIGHT_JOIN est similaire à JOIN, sauf que la table de gauche est toujours lue avant la table de droite. Cela peut être utilisé pour les cas (peu nombreux) pour lesquels l'optimiseur de jointures place les tables dans le mauvais ordre."

18voto

IAdapter Points 15876

MySQL n'est pas nécessairement bon pour choisir l'ordre de jointure dans les requêtes complexes. En spécifiant une requête complexe comme straight_join, la requête exécute les jointures dans l'ordre indiqué. En plaçant d'abord la table comme le plus petit dénominateur commun et en spécifiant straight_join, vous pouvez améliorer les performances de la requête.

11voto

mitendra Points 156

STRAIGHT_JOIN , en utilisant cette clause, vous pouvez contrôler l'ordre JOIN : quelle table est analysée dans la boucle externe et laquelle se trouve dans la boucle interne.

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