Je suis tombé sur une requête qui prend "trop long". La requête a plus de 50 jointures entre 10 tables ou plus. Pour donner un bref aperçu du modèle de base de données, les tables jointes sont des tables qui stockent des données pour un type de données particulier (ex: date_fields, integer_fields, text_fields, etc.) et chacune a une colonne pour la valeur, un identifiant "datafield", et un identifiant de ticket. La requête est construite par programme sur la base d'une table d'association entre un "ticket" et ses "champs de données".Optimiser une requête qui utilise plusieurs jointures à gauche sur les mêmes tables
La jointure des déclarations ressemblent à ce qui suit:
...FROM tickets t
LEFT JOIN ticket_text_fields t001 ON(t.id=t001.ticket_id AND t001.textfield_id=7)
...
LEFT JOIN ticket_date_fields t056 ON(t.id=t056.ticket_id AND t056.datafield_id=434)
Lorsque vous utilisez expliquer sur la requête indique ce qui suit:
1 SIMPLE t ref idx_dataset_id idx_dataset_id 5 const 2871 Using where; Using temporary; Using filesort
1 SIMPLE t001 ref idx_ticket_id,idx_datafield_id idx_ticket_id 5 t.id 5
...
1 SIMPLE t056 ref idx_ticket_id,idx_datafield_id idx_ticket_id 5 t.id 8
Quelle direction puis-je prendre pour régler cette question? Tous les index semblent être en place. Peut-être que le numéro de ligne de la table t (tickets) (2871) devrait être réduit. Combien de jointures gauche est trop? Les tables de datafield doivent-elles être jointes une seule fois, puis interrogées chacune pour les données requises?
Bonne réponse Bill! Je ne pouvais pas penser à une bonne solution sans changer le schéma, alors j'ai continué à recharger cette question pour voir ce que les autres diraient. J'aime ta solution. –
D'accord. Merci pour l'info et la solution! –