Si la colonne speed
est pas unique dans ces tableaux (et probablement ce n'est pas, étant donné que vous avez dit que vous avez ajouté un index avec speed
comme colonne principale ...
Si t Dans ces tableaux, il y a plusieurs lignes avec la même valeur de speed
, alors votre requête pourrait créer un immense ensemble.
Faisons quelques calculs simples. S'il y a deux lignes dans chaque table qui ont la même valeur de vitesse, alors les opérations JOIN entre a et b créeront 4 lignes pour cette vitesse. Lorsque nous ajoutons la jointure à c, avec deux autres lignes, cela représente un total de 8 lignes. Quand nous obtenons toutes les 22 tables jointes, chacune avec deux lignes, nous sommes à 2^22 ou plus de 4 millions de lignes. Et puis cet ensemble de lignes, avec la même valeur pour speed
, doit être traité dans une opération GROUP BY pour éliminer les doublons.
(Bien sûr, si l'une des tables n'a pas de ligne de cette même valeur speed
, la requête produirait aucune ligne pour cette speed
.)
Personnellement, je l'ancien fossé Syntaxe de virgule pour l'opération JOIN et utilisez le mot clé JOIN à la place. Et je déplacerais les prédicats de jointure de la clause WHERE vers la clause ON appropriée.
Je ferais également de l'une des tables le "pilote" pour toutes les jointures, j'utiliserais une référence à la même table dans chacune des jointures. (Nous savons que si a=b
et b=c
, puis a=c
. Mais je ne suis pas sûr de l'optimiseur MySQL, si cela fait une différence si nous spécifions a=b and a=c
à la place de a=b and b=c
.
S'il y a un nombre relativement peu de valeurs distinctes de speed
dans chacune des tables, mais beaucoup de lignes avec la même valeur, je considérerais en utilisant des vues en ligne pour obtenir une seule rangée pour chaque vitesse de chacune des tables MySQL peut utiliser un index approprié pour optimiser le GROUPE PAR l'opération sur chaque table individuelle ... J'opterais pour un index de couverture ... par exemple
ON wspeed20 (speed, pid, `or`)
ON wspeed24 (speed, pid, `or`)
Unfor En règle générale, la table dérivée (résultat d'une requête de vue en ligne) n'est pas indexée, de sorte que les opérations JOIN peuvent être coûteuses (pour un grand nombre de lignes de chaque requête de vue en ligne).
SELECT a.month,a.roadTypeID,a.speed,a.pid,a.or, b.pid, b.or, c.pid, c.or, d.pid, d.or,
e.pid, e.or, f.pid, f.or, g.pid, g.or, h.pid, h.or, i.pid, i.or, j.pid, j.or,
k.pid, k.or, l.pid, l.or, m.pid, m.or, n.pid, n.or, o.pid, o.or, p.pid, p.or,
q.pid, q.or, r.pid, r.or, s.pid, s.or, t.pid, t.or, u.pid, u.or, v.pid, v.or
FROM (SELECT speed, pid, `or` FROM wspeed2 GROUP BY speed) a
JOIN (SELECT speed, pid, `or` FROM wspeed3 GROUP BY speed) b ON b.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed20 GROUP BY speed) c ON c.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed24 GROUP BY speed) d ON d.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed25 GROUP BY speed) e ON e.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed26 GROUP BY speed) f ON f.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed27 GROUP BY speed) g ON g.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed63 GROUP BY speed) h ON h.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed65 GROUP BY speed) i ON i.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed68 GROUP BY speed) j ON j.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed69 GROUP BY speed) k ON k.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed70 GROUP BY speed) l ON l.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed71 GROUP BY speed) m ON m.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed72 GROUP BY speed) n ON n.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed73 GROUP BY speed) o ON o.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed74 GROUP BY speed) p ON p.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed75 GROUP BY speed) q ON q.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed76 GROUP BY speed) r ON r.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed77 GROUP BY speed) s ON s.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed78 GROUP BY speed) t ON t.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed81 GROUP BY speed) u ON u.speed = a.speed
JOIN (SELECT speed, pid, `or` FROM wspeed82 GROUP BY speed) v ON v.speed = a.speed
qui a le potentiel de réduire le nombre de lignes à joindre (à nouveau, s'il y a un grand nombre de valeurs en double pour speed
, et un petit nombre de valeurs distinctes pour speed
.) Mais , encore une fois, les opérations JOIN entre les tables dérivées n'auront aucun index disponible. (Au moins, pas dans les versions de MySQL jusqu'à 5.6.)
Je viens de Microsoft fond; cependant, en général, j'utiliserais la table temporaire ou d'autres tables de transfert quand j'ai plus de 5 tables à joindre. –
Ceci est le principal problème avec les bases de données SQL. Il n'y a pas de meilleure façon de le faire que je suis au courant de – ControlAltDel