ich drei Tabellen haben, dieMySQL LEFT JOIN nur letzte Reihe quälend langsam
Forts
|id|lat|lon|
fort_sightings
|id|fort_id|team|
fort_raids
sieht wie folgt aus|id|fort_id|raid_level|
Ich brauche eine Abfrage, die die neuesten Informationen von fort_sightings
und fort_raids
, wenn überhaupt alle Zeilen aus forts
und wählen Sie dann abruft. Es könnte mehrere Zeilen geben, in denen fort_id
den gleichen Wert hat, also brauche ich die neuesten Informationen.
Derzeit habe ich das, was nicht der hübscheste
SELECT
*
FROM
forts c
LEFT JOIN fort_sightings o ON o.id = (
SELECT
id
FROM
fort_sightings
WHERE
fort_id = c.id
ORDER BY
id DESC
LIMIT 1
)
LEFT JOIN fort_raids r ON r.id = (
SELECT
id
FROM
fort_raids
WHERE
fort_id = c.id
ORDER BY
id DESC
LIMIT 1
)
sein könnte Aber es ist sehr langsam, die Abfrage dauert mehr als 10 Sekunden. Es gibt nur ~ 350 Reihen in forts
, also sollte es wirklich nicht so lange dauern. Ich glaube, es ist von allen SELECT
Abfragen in der JOIN
, aber ich kenne keine Alternative.
Jede Frage, die mit langsamen Abfragen enthält die Ausgabe von 'EXPLAIN' beschäftigt. Bitte schau dich um, um zu sehen, wie man EXPLAIN ausgibt und poste es hier. – Mjh
Sub-Abfragen sind immer langsam, und in diesem Fall machen Sie eine Unterabfrage für jede o.id und r.id, wenn ich mich nicht irre. Finden Sie immer einen Weg, um Unterabfragen zu vermeiden. – Goose
Um herauszufinden, warum es so langsam ist, benutze 'explain' gefolgt von dieser Abfrage (in der mysql-Befehlszeile), die dir sagen wird, welche Indizes benutzt werden und wieviele Datensätze gelesen werden. Sie können entweder Ihren Code ändern, um Indizes zu verwenden, oder Index hinzufügen, wenn er wirklich benötigt wird. – Tamar