2012-01-12 63 views
0

我剛剛發現MySQL使用InnoDB引擎的以下行爲。有沒有辦法解釋執行時間的顯着差異?MySQL的QueryOptimizer似乎隨機使用索引(或不)

首先查詢:

SELECT ask FROM history_time WHERE ask> 1.5790 AND timestamp BETWEEN 1207000800290 AND  1207690900290 

執行時間:0.715sec

EXPLAIN: '1', 'SIMPLE', 'history_time', 'range', 'PRIMARY,timestamp,ask,ask_2', 'PRIMARY', '8', NULL, '3278190','Using where' 

第二個查詢:

SELECT ask FROM history_time WHERE ask> 1.5790 AND timestamp > 1207000800290 

執行時間:0.002sec

EXPLAIN: '1', 'SIMPLE', 'history_time', 'range', 'PRIMARY,timestamp,ask,ask_2', 'ask', '4', NULL, '5850604', 'Using where; Using index' 

第三個查詢:

SELECT ask FROM history_time WHERE ask> 1.5790 AND timestamp < 1207690900290 

執行時間:0.651sec

EXPLAIN: '1', 'SIMPLE', 'history_time', 'range', 'PRIMARY,timestamp,ask,ask_2', 'PRIMARY', '8', NULL, '3278190', 'Using where' 

EXPLAIN告訴我,只有第二個查詢使用索引。我的表格包含83 Mio.行,主鍵是時間戳。我也有一個索引(問,時間戳)和一個詢問(這是多餘的,只爲測試目的)。爲什麼MySQL只在第二個查詢中使用索引?

+0

可以添加解釋爲每個查詢請了,請使用'計時您的SQL查詢SQL_NO_CACHE':'SELECT SQL_NO_CACHE問FROM history_time WHERE問> 1.5790和時間戳> 1207000800290' – frail 2012-01-12 11:13:44

+0

,謝謝,我剛添加的解釋 - 定時完成沒有使用緩存 – user871784 2012-01-12 11:25:55

回答

1

你的答案是:The Range Access Method for Multiple-Part Indexes

編輯:,你也將更好地檢查:mysql range index。優化器有可能決定使用全掃描然後索引會更快。

+0

感謝您的幫助!有沒有一種方法來優化這個? – user871784 2012-01-12 12:23:49

+0

取決於「問」列的基數。如果你要查詢一個特定的時間,並且你的計時數據小於問基數,我會建議一個時間戳索引;如果不是這樣的話,那將會浪費資源和空間。 – frail 2012-01-12 12:27:09

0

您的查詢具體使用時間戳記作爲主鍵,也是通過您的評論(問,時間戳)詢問的索引。交換它......你希望第一個位置的粒度更小......(時間戳,問)......除非你要求一個非常具體的詢問值或詢問值的範圍。這樣想想吧。

如果你有8300萬行,你所要求的東西X和Y的時間內發生了,時間戳是你的基礎...爲什麼要考慮什麼比有問題的區域小或更大。現在,添加「ask> someValue」,優化器可能會感到困惑。猜猜...有更少的值大於問題值,或者更少的值是基於提供的時間戳範圍。如果你有一個索引(時間戳,問),它可以更好地利用它。在提供的範圍內,只需要詢問> SomeValue。

如果優化器使用了當前的Ask索引,它基本上會遍歷所有大於所提供值的條目......然後在每個條目中跳轉到時間戳範圍內的條目。

現在,更換您的條件。如果你正在尋找一個特定的「詢問」值或範圍,那麼你當前的指標將會非常好。它只會關注這個範圍。

+0

'(timestamp,ask)'索引如何提供幫助?查詢使用兩列的範圍條件。 – 2012-01-29 16:17:45

+0

@ypercube,我想我正在查看第一個條目,但是不知道更多關於「詢問」範圍值的統計數據「或者他們試圖實際獲得的結果是如果能夠首先優化特定範圍,那麼只需要獲取比「ask」值大的所有條目,而不是所有「ask」值,這些值可能是從幾歲到現在。否則堅決打電話。 – DRapp 2012-01-29 16:25:28