簡體   English   中英

如何優化SQL查詢?

[英]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

在您的查詢中,您僅從一張表中檢索數據,並且您的過濾條件是...

  1. symbol平等

  2. 范圍從低到高掃描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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM