我有三個表,它看起來像這樣MySQL的左連接只有最後一排十分緩慢
堡壘
|id|lat|lon|
fort_sightings
|id|fort_id|team|
fort_raids
|id|fort_id|raid_level|
我需要獲取所有從forts
行,然後選擇從fort_sightings
和fort_raids
的最新信息,如果任何一個查詢。可能有多行fort_id
具有相同的值,所以我需要最新的信息。
目前,我有這個,這可能不是最漂亮的
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
)
但它是痛苦的緩慢,查詢接管10秒。 forts
只有〜350行,所以它真的不應該花這麼長時間。我相信它來自JOIN
中的所有SELECT
查詢,但我不知道任何替代方案。
每一個問題與慢查詢涉及包含EXPLAIN'的'輸出。請看看如何獲得'EXPLAIN'的輸出並將其發佈在這裏。 – Mjh
子查詢總是很慢,在這種情況下,如果我沒有弄錯,你正在爲每個o.id和r.id做一個子查詢。總是找到一種避免子查詢的方法。 – Goose
爲了找到它爲什麼這麼慢,使用'explain'後面跟着這個查詢(在mysql命令行中),它會告訴你使用了哪些索引以及讀取了多少記錄。你可以改變你的代碼來使用索引或添加索引,如果它真的需要的話 – Tamar