內我有此查詢:快速的查詢速度變慢時,子查詢
SELECT timestmp
FROM devicelog
WHERE device_id = 5
ORDER BY id DESC LIMIT 1
這需要小於0.001秒的讀取,但一旦我把它放在一個子查詢,它會減慢至3.05秒。任何理由爲什麼這樣做,或者我可以如何補救?
這裏是第二個查詢(這是一個我想優化):
SELECT device.id,
(SELECT timestmp
FROM devicelog
WHERE device_id = device.id
ORDER BY id DESC LIMIT 1) as timestmp
FROM device
表「設備」只有像10-15記錄它(devicelog有幾百萬),所以我會假設它在每條記錄中都是1乘1,然後執行子查詢,但顯然它正在做其他事情。 devicelog的PK就是id,而設備中的PK也是它的id。 devicelog上有一個索引timestmp
(這是一個日期時間)和device_id
,這也是一個FK回devicelog。還有其他的指標,但它們是不相關的(比如名稱,描述等)。
我只是它需要遍歷設備,然後顯示最後的時間戳記錄。
如果我列出每個設備在PHP中,然後分別進行第一次查詢,將執行非凡的好,但我想這樣做在一個整個查詢。就像,我可以做類似(僞):
foreach($row in <devicelog>)
query('<first query> where id = $row[id]')
做一個完整的加盟將是對devicelog太貴了,只是因爲高計數。
試過了,大約需要7秒。 device_id(PK)和時間戳有幾個索引。 –
@RalphWiggum,非規範化技術的修訂答案 – DRapp
是的,我想插入觸發器將是最好的方式來做到這一點,但試圖避免使用它。 –