Sie führen eine natürliche Verknüpfung von 4 Tabellen durch. Außerdem gibt es in Ihrer "WHERE"-Anweisung keine besonderen Bedingungen.
Die Datenbank-Engine wird folgendes tun:
Zunächst wird ein rekursives Produkt aller Daten in jeder Tabelle erstellt.
Betrachten Sie die folgenden Zeilen in den Tabellen A, B und C:
A = rowA1
rowA2
rowA3;
B = rowB1
rowB2
rowB3;
C = rowC1
rowC2
rowC3;
Wenn Sie eine natürliche Verknüpfung dieser 3 Tabellen vornehmen, hat die Maschine im Grunde genommen einen Speicherplatz:
rowA1 - rowB1 - rowC1
rowA1 - rowB1 - rowC2
rowA1 - rowB1 - rowC3
rowA1 - rowB2 - rowC1
rowA1 - rowB2 - rowC2
rowA1 - rowB2 - rowC3
rowA1 - rowB3 - rowC1
rowA1 - rowB3 - rowC2
rowA1 - rowB3 - rowC3
...
...
...
rowA3 - rowB3 - rowC1
rowA3 - rowB3 - rowC2
rowA3 - rowB3 - rowC3
Insgesamt werden 27 Zeilen im Speicher abgelegt. Wir wollen aber nur 3 Zeilen:
rowA1 - rowB1 - rowC1
rowA2 - rowB2 - rowC2
rowA3 - rowB3 - rowC3
Wenn Ihre Datenbank-Engine die Optimierung nicht von selbst vornimmt, ist eine natürliche Verknüpfung von 3 Tabellen sehr teuer. Bei 4 Tabellen ist dies unvorstellbar, selbst bei einer begrenzten Anzahl von Zeilen.
Wie können wir nun etwas Besseres bekommen?
Wenn wir uns den Code ansehen, wissen wir, dass wir nur 5 Werte benötigen. Außerdem heißt es in der Datenbankoptimierung, dass man den SELECT so früh wie möglich durchführen sollte.
Hier ist ein ungetesteter Code, der Ihnen helfen soll. Möglicherweise müssen Sie ihn ändern, je nachdem, welche DB-Engine Sie verwenden:
SELECT *
FROM (SELECT * FROM equipment LIMIT 5) e, tiremap, workreference, tirework
WHERE e.tiremap = tiremap.TireID AND
tiremap.WorkMap = workreference.`aMap` AND
workreference.`bMap` = tirework.workmap
Dadurch sollte es so aussehen, als hätten wir nur 3 Tische und nicht 4. Das ist jedoch nicht wirklich das, was Sie wollen. Wenn eine Zeile der "Ausrüstung" nicht in den anderen Tabellen referenziert wird, erhalten Sie am Ende weniger als 5 Zeilen. Dies ist jedoch nur ein Beispiel, um Ihnen zu zeigen, dass wir nicht unbedingt alle Zeilen aus allen Tabellen benötigen.
Nun, ich denke, was Sie wollen, könnte Folgendes sein:
SELECT * FROM equipment
INNER JOIN tiremap ON equipment.tiremap = tiremap.TireID
INNER JOIN workreference ON tiremap.WorkMap = workreference.aMap
INNER JOIN tirework ON workreference.bMap = tirework.workmap
LIMIT 5
Sie könnten hier ein Problem haben: wenn Ihre Engine nicht so gut ist (mySQL, sorry), kann es sehr lange dauern.
Wenn Sie die Optimierung wirklich selbst vornehmen wollen:
SELECT * FROM tirework,
(SELECT * FROM workreference,
(SELECT * FROM tiremap,
(SELECT * FROM equipment) e
WHERE e.tiremap = tiremap.TireID) t
WHERE t.WorkMap = workreference.aMap) w
WHERE w.bMap = tirework.workmap
LIMIT 5
Und voilà! Selbst wenn Ihre Engine nicht optimiert ist, sollte diese Abfrage nicht allzu lange dauern. Anstatt ein großes Produkt aus allem zu machen, wird Ihre Maschine ein Produkt nach dem anderen machen und die schlechten Zeilen herausnehmen, bevor sie es mit einer neuen Tabelle verbindet.
Versuchen Sie es.