SELECT PROJECTKEY, CONCAT(FIRSTNAME,' ',LASTNAME) as USRCREATED,
CONCAT('/userImages/',md.USERKEY,'/',md.IMAGE) as USRCREATED_PROFILE_IMG,mm.DTCREATED
FROM kbedumoment mm
left join users md on mm.USRCREATED=md.USERKEY
where mm.id in
(
SELECT mm.id from kbedumoment mm
left join kbedumomentpostto pt on pt.MOMENT_ID=mm.id
where mm.deleted_at is NULL
&& pt.childkey=1005
union all
SELECT id from kbedumoment mm
where POST_TO='school' && mm.deleted_at is NULL && mm.PROJECTKEY =2
)
order by mm.id desc
查詢上面需要6.875秒,這需要很長時間。其中子查詢花費的時間太長,需要優化
我試過單獨執行的子查詢。
SELECT mm.id from kbedumoment mm
left join kbedumomentpostto pt on pt.MOMENT_ID=mm.id
where mm.deleted_at is NULL
&& pt.childkey=1005
union
SELECT id from kbedumoment mm
where POST_TO='school' && mm.deleted_at is NULL && mm.PROJECTKEY =2
結果:
+-------+
| id |
+-------+
| 253 |
| 1264 |
| 1 |
| 238 |
+-------+
持續時間:0.109秒。所以子查詢沒問題。
然後我執行以下測試,用我已經知道的ID替換子查詢。
SELECT PROJECTKEY, CONCAT(FIRSTNAME,' ',LASTNAME) as USRCREATED,
CONCAT('/userImages/',md.USERKEY,'/',md.IMAGE) as USRCREATED_PROFILE_IMG,mm.DTCREATED
FROM kbedumoment mm
left join users md on mm.USRCREATED=md.USERKEY
where mm.id in
(
1264,253,238,1
)
order by mm.id desc
這究竟是爲什麼?
對於這樣的情況下,明顯的解釋失敗了,你應該嘗試在查詢上運行'EXPLAIN'。也許MySQL有一個可以解釋行爲的步驟。 –
添加了解釋後。 – ethan17
不是答案,但由於某些原因,MySQL在最後一個查詢中使用了範圍掃描,但在實際感興趣的查詢中使用了索引掃描。範圍應該超過指數,這可以解釋數字。但我不知道如何解決這個問題。當你有更大的表格時,你可能會擔心這一點。您的期望可能會發生在更大的數據集上。 –