2010-08-27 103 views
0

我使用索引的MySQL表。Expain「解釋」的查詢結果在MySQL

我的查詢是這樣

EXPLAIN SELECT * FROM `logs` WHERE userId =288 AND dateTime BETWEEN '2010-08-01' AND '2010-08-27' 

我對現場用戶id索引此表的日誌, 並解釋查詢的結果是類似下面。

id select_type  table  type possible_keys key  key_len  ref  rows Extra 
1  SIMPLE   logs  ref  userId  userId  4  const 49560 Using where 

的問題是「我的索引是真正有用或沒有?」 ......提前

感謝

@fastmultiplication

我認爲雙方本場索引可能會增加加載在mysql上,因爲將會有很多條目具有唯一的(userId和dateTime)。 我已經嘗試添加兩個userId_dateTime索引和結果是

id select_type  table type possible_keys   key  key_len  ref  rows Extra 
1  SIMPLE  logs ref  userId_dateTime userId_dateTime  4  const 63455 Using where 

回答

2

您的查詢使用索引,是的,他們是有用的。您可能會發現下面的文檔頁面有用:

EXPLAIN Output Format
How MySQL Uses Indexes
Multiple-Column Indexes

另外:

Multiple column index vs multiple indexes

的MySQL通常會使用返回的行數最少的索引。在你的第一個例子中,MySQL使用userId指數的行數縮小到49560.這意味着,userId不包含唯一值(如果它沒有,你就不需要日期範圍條件)。由於dateTime列中沒有索引,因此必須掃描每一行才能找到符合日期範圍條件的索引。

在第二個示例中,您似乎在userIddateTime上創建了複合(多列)索引。在這種情況下,似乎MySQL無法使用BETWEEN子句—的後半部分索引我不確定原因。可能值得用兩個單獨的索引來嘗試它,而不是多列索引。你也可以試試用替換BETWEEN

'2010-08-01' >= AND <= '2010-08-27' 

這應該是相同的,但看到下面的錯誤報告,這可能會影響你的MySQL版本:

Optimizer does not use index for BETWEEN in a JOIN condition

1

從「行」現場看起來像MySQL仍然估計將要看看很多行。

你應該嘗試添加索引的日期時間字段,太。

而對於這個特定的查詢,也許在兩個領域的指標。

alter table logs add index user_datetime (userId,dateTime); 
+0

我已經進入詳細有問題,請檢查 – 2010-08-27 07:04:19

0

多少行應該查詢回報?查詢運行速度有多快?

它看起來對我來說,一個非常簡單的查詢,它使用的是正確的索引,所以如果是因爲某些原因慢,這可能是因爲它實際上返回大量的數據。如果您對所有行沒有興趣,可以使用LIMIT獲取更少。