left join multiple sur grosses tables
Bonjour,
Je suis à la recherche d'un petit conseil concernant des jointures de tables.
Je fais une appli php-mysql. Une partie de cette appli exécute des requêtes assez balaises. Cad que je vais chercher des champs dans différentes tables assez volumineuses 4000-7000 enregistrements avec des joins. Biensur je limite les résultats avec des where mais j'arrive quand même à des retours de 3-4000 enregistrements à afficher dans IE... no comment, je peux pas séparer en pages, les utilisateurs préfèrent tout avoir sous les yeux d'un coup. Mais par contre ca rame au taquet, 8 minutes pour renvoyer les résultats.
Pour les jointures, je réalise des "left join". Ma question est donc "est-ce que l'ordre des joins est important ?". J'entends par la que je commence par joindre les tables où mon where s'applique.
Merci d'avance
Re: left join multiple sur grosses tables
Une petite révision s'impose:
L'intérêt du LEFT JOIN (ou LEFT OUTER JOIN) est de retourner NULL s'il n'y a pas de correspondance dans la table de droite, donc cette opération est non commutative. Par contre, si tu as toujours une correspondance entre les 2 tables liées, alors il vaut mieux utiliser un INNER JOIN.
En effet, avec un INNER JOIN, l'opération est commutative et il me semble que MySQL effectue certaines optimisations en fonction du nombre d'enregistements renvoyés par la table (en commençant par la table qui renverra le moins d'enregistrements).
Dans le doute, commence par les table où le WHERE risque d'être le plus restrictif et remplace tes LEFT JOIN par des INNER JOIN (à moins que tu aies un réel besoin d'avoir un LEFT JOIN, mais puisque que tu parles d'inverser l'ordre de tes jointures, j'en doute)
Aussi, utilise des index sur certaines colonnes de tes tables, si ce n'est pas déjà fait.
Pour plus d'info, tu as toute la partie 7.2 de la doc MySQL:
http://dev.mysql.com/doc/refman/5.1/en/query-speed.html
Voilà.
Par contre, je trouve ça aberrant de vouloir afficher plusieurs Mo de données avec IE... (ah, ces utilisateurs !). Sinon, à défaut d'afficher sur plusieurs pages, pense à afficher en plusieurs tableaux (pour ne pas attendre que tout s'affiche à la fin, pour avoir un rappel des entêtes, etc.)