[英]How optimize SQL query?
我有一個查詢:
SELECT * FROM `trades`
WHERE `symbol` = 'ICX/BTC' AND `timestamp` >= :since AND `timestamp` <= :until
ORDER BY `timestamp`
LIMIT 50000
執行時間較長(超過5分鍾)。 我有按符號和時間戳列索引
如何優化此查詢?
對於此查詢:
SELECT t.*
FROM trades AS t
WHERE t.symbol = 'ICX/BTC' AND t.timestamp >= :since AND t.timestamp <= :until
ORDER BY t.timestamp
LIMIT 50000;
(我只是重寫了一點,所以我可以更輕松地遵循它)
您想要trades(symbol, timestamp)
指數trades(symbol, timestamp)
。
但是,您似乎選擇了很多行,因此這可能仍需要很長時間。 該索引應同時用於WHERE
子句和ORDER BY
。
在您的查詢中,您僅從一張表中檢索數據,並且您的過濾條件是...
symbol
平等
范圍從低到高掃描timestamp
。
因此,(如Gordon所述)兩列(symbol, timestamp)
上的索引可以非常有效地滿足您的查詢(包括過濾和排序)。 查詢計划者將對索引執行隨機訪問操作,以獲取正確的符號和起始時間戳,然后順序讀取索引,直到終止時間戳。 那很有效。
但是,您的SELECT *
可能會阻礙您的性能。 為什么? 例如,如果使用SELECT symbol, timestamp, cusip, name
則可以在(symbol, timestamp, cusip, name)
上創建所謂的覆蓋索引。 在這種情況下, 整個查詢將通過掃描索引來滿足。 這確實可以非常有效。
提示出於軟件穩定性和性能的原因,請避免使用SELECT *
。
溫馨提示不要在表中添加額外的索引,除非您知道它們會幫助特定的查詢。 MySQL僅對查詢或子查詢中的每個表使用單個索引。 僅在timestamp
或僅在symbol
上的索引都無濟於事:MySQL仍必須檢查很多行才能滿足過濾條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.