2012-01-17 43 views
2

我在嘗試瞭解如何正確使用帶有基本查詢的索引。通過簡單的選擇查詢瞭解索引

例如:

我有以下幾列的表 'TESTME':

id int primary key 
username varchar(20) 
data1 int 
data2 int 
data3 int 
data_order int 

,如果我做

select username,data1,data2 from testme where data3=5 order by data_order; 

哪一種指標,我可以用它來加快查詢?

我試着在列data3和data_order上添加索引,但對該查詢的'explain'結果表明它不使用該索引。

更新: 使用的MySQL Cluster(NDB)

+0

你的桌子有多大?我不確定MySQL,但在許多RDBMS中,通過表掃描而不是索引訪問相對較小的表(通常少於大約100,000行)會更快。 – 2012-01-17 12:46:58

+0

這個表格實際上很小,但是這個查詢出現在我的緩慢查詢日誌 – ufk 2012-01-17 12:50:14

+0

上,因爲@Dems建議應該是最好的,所以''(data3,data_order)'上的BTREE索引。 – newtover 2012-01-17 12:55:57

回答

2

這個特定的查詢有兩個指標,這將有助於 -

指數上DATA3(哈希如果你確信會有隻DATA3查詢等於東西,否則使用btree)和索引data_order(btree)

編輯:在這種情況下,單獨的索引是更好的,因爲AFAIK mysql不總是搜索複合索引的where和order語句,另一個問題是,你不能只使用這個索引的順序(索引會是用於DATA3 + data_order或僅用於DATA3如MySQL的讀取從最左邊的列索引)

+0

您如何看待這兩列有單一索引? – 2012-01-17 12:35:29

+0

這是行不通的,因爲當你在where語句中有兩個字段時,單個索引是好的 – SergeS 2012-01-17 12:41:53

+0

你確定,這意味着當你有一個包含其他列的組合索引時索引不會被使用嗎? – 2012-01-17 12:44:11

1

的情況下,最好指數(實際上取決於表的大小和DATE3的基數):

CREATE INDEX yourindex ON yourtable(Data3, Data_order) 
INCLUDE(username, data1, data2) 

,或者如果MySQL的不支持包括列

CREATE INDEX yourindex ON yourtable(Data3, Data_order, username, data1, data2) 

爲什麼最好?

  • 過濾器直接date3值由data_order
  • 訂單包含了所有你需要的選擇列表(包括指數)(如果MySQL支持包括列)

更新:

對於 tables the optimi zer可以選擇使用表掃描而不是索引。

表格中的更數據,* 就越有可能指標將被使用,特別是當指數的基數是足夠高的指數

+0

在你的例子中是什麼'INCLUDE'?它似乎不被MySQL支持:http://dev.mysql.com/doc/refman/5.1/en/create-index.html – newtover 2012-01-17 12:38:55

+0

索引定義中的「ASC」使人們錯誤地認爲'DESC'可能會有道理。不幸的是,MySQL還不是這樣。 – newtover 2012-01-17 12:43:27

+0

這只是提供了一個錯誤,語法不顯示create index命令有include參數。 – ufk 2012-01-17 12:46:05

2

覺得作爲兩件事情...
1。數據存儲的順序
2。查找特定數據片段的快速方法(如書籍索引)

在您的示例中,使用(data3, data_order)上的索引可以非常容易地找到所需的數據,並且已按正確的順序排列。

搜索索引後仍然需要去表格,得到字段username, data1, data2。爲此,您也可以在索引中輸入include。這使得指數更大,使用更多的空間和更多的努力來更新。但是這個成本意味着該指數並不是加入的表格。它只是讀索引。