Submitted by sahuni on
Bonjour
J'aimerais juste un conseil
Quand on lit séquentiellement une table (par exemple content_type_aaa) et que l'on fait une jointure avec la table node, y a-t-il une différence de performance si on met la table node à gauche ou à droite?
Donc :
'SELECT * FROM {content_type_pub} p INNER JOIN {node} n ON p.nid = n.nid‘
ou
('SELECT * FROM {node} p INNER JOIN {content_type_pub} n ON p.nid = n.nid‘
C'est du pareil au même?
Je pose la question car je pense qu'il y a souvent des jointures avec node ...
Et en fait dans la table de droite, on prend forcément tous les champs? (alors que dans celui de gauche on peut choisir un ou plusieurs ou tout).
Fondamentalement c'est pas
Permalien Soumis par Damien Tournoud le 30 Juillet, 2009 - 16:16
Fondamentalement c'est pas pareil : le serveur de base de données doit parcourir la première table et faire un index lookup sur l'autre table. Si ces deux tables ont des cardinalités très différentes (mettons: t1 compte 3 lignes, t2 compte 3 millions de lignes), le coût de ces deux requêtes peut être très différent.
Par contre, un INNER JOIN est par définition symétrique. Le planificateur de requêtes du serveur peut donc choisir de commencer la requête par une table ou l'autre. C'est pas toujours très fiable (en particulier si tu ajoutes des ORDER BY là dedans), mais ca marche assez bien dans le cas général.
Donc dans mon exemple Ce
Permalien Soumis par sahuni le 30 Juillet, 2009 - 16:44
Donc dans mon exemple
Ce serait mieux de mettre content_type_aaa à gauche (car c'est la plus petite table) et node à droite.
Et de faire un left join pour ne pas donner le choix au planificateur de requêtes.
Merci beaucoup pour ces explications