2011-03-21 2 views
0

à High Performance MySQL à la page 159, ils parlent de briser des requêtes complexes en simples:MyISAM Performance: Rejoindre la décomposition?

Conversion

SELECT * FROM tag 
JOIN tag_post ON tag_post.tag_id=tag.id 
JOIN post ON tag_post.post_id=post.id 
WHERE tag.tag='mysql'; 

Pour

SELECT * FROM tag WHERE tag='mysql'; 
SELECT * FROM tag_post WHERE tag_id=1234; 
SELECT * FROM post WHERE post.id in (123,456,567,9098,8904); 

Et faire en quelque sorte le réel vous joindre à votre demande. Ma question est de savoir si c'est une bonne idée quand la requête finale a une clause where avec quelques milliers d'identifiants qu'elle doit correspondre (la table elle-même a environ 500k entrées).

Ce que je veux dire est, il y aura une grande pénalité pour avoir une requête comme

SELECT * FROM post WHERE post.id in (123,456,567, ... <a few thousand IDs here> ... ,9098,8904); 

au lieu de la jointure-déclaration ci-dessus? Cela aiderait-il à déplacer cette logique vers les procédures stockées dans la base de données (tout en considérant comment les procédures stockées sont mal implémentées dans MySQL)?

+0

Consultez le lien suivant pour une comparaison des performances entre une grande clause IN et une table de jointure temporaire. http://explainextended.com/2009/08/18/passing-parameters-in-mysql-in-list-vs-temporary-table/ –

+0

merci, cette page était utile – Dexter

Répondre

2

La décomposition des jointures est utile dans certaines situations, mais dans la plupart des cas, les jointures seront plus rapides.

Dans votre cas, je voudrais coller avec les jointures au lieu de passer dans quelques milliers d'ID dans une clause IN.

+0

Pourriez-vous s'il vous plaît expliquer pourquoi les jointures vont Être plus rapide? – hungneox