我創建沒有「USING BTREE」子句的索引。使用BTREE索引有什麼優勢嗎?BTREE的優勢?
CREATE INDEX `SomeName` USING BTREE ON `tbl_Name`(`column_name`);
我創建沒有「USING BTREE」子句的索引。使用BTREE索引有什麼優勢嗎?BTREE的優勢?
CREATE INDEX `SomeName` USING BTREE ON `tbl_Name`(`column_name`);
BTREE是默認的索引方法。你可以放心地省略它。
這真的取決於存儲引擎 – 2009-11-06 14:29:53
這對於所有存儲引擎都是不正確的。 – 2009-11-06 14:30:15
這取決於您正在使用的存儲引擎。對於大多數情況,BTREE是默認的,因此指定它並不會真正改變任何內容。對於諸如MEMORY/HEAP和NDB的存儲引擎,缺省情況下默認使用HASH索引。
的更多信息,可以發現here.
無論B樹或哈希索引是你有利,從性能的角度取決於數據,以及如何你訪問它。如果您知道您的查詢將準確定位到一行或分散的單個行,那麼HASH索引可能會很有用。除此之外,我通常更喜歡BTREE索引,因爲數據是排序的,因此可以進行範圍查詢以及返回多行的效率更高的查詢。
首先,根據所使用的存儲引擎,您可能沒有選擇(例如,InnoDB專門爲其索引使用BTREE)。
此外,BTREE是大多數存儲引擎的默認索引類型。
現在...有些情況下,使用替代索引類型可能會導致性能提高。有(相對罕見的情況下)HASH索引可能有所幫助。請注意,當創建HASH索引時,還會生成一個BTREE索引。部分原因在於散列索引只能解析相等謂詞。 (例如WHERE Price> 12.0的條件不能由散列索引處理)。
簡而言之:保持使用BTREE,無論是隱式(如果BTREE是所用存儲的缺省值),還是顯式地使用。瞭解其他類型的指數,以便您瞭解它們是否需要。
編輯:(在搜索情況下,當可以使用替代的索引類型)
有效的情況下是相當爲RTREE索引直線前進。這些僅在"SPATIAL" databases的上下文(即,包括地理位置上下文,諸如GIS模型中的點和其他對象的數據庫)的情況下用MySQL支持)。
散列索引是更通用的(不侷限於特定的應用或數據類型),和一個一般可以按照哈希的一個直觀的認識得到一個提示,當這些可能跑贏老,但忠實的BTREE。如前所述,這意味着列通常以相同的謂詞搜索。我猜測相對較短的查找表等可能會受益,這取決於MySQL中的有效實現。
如果我們不需要排序,我們如何強制MySQL創建一個散列索引而不是一個btree索引? (例如,不需要排序的主鍵) – Pacerier 2012-07-05 22:51:37
搜索平衡樹意味着所有的葉子都在相同的深度。沒有跑道指針的開銷。的確,更大的B樹可以保證必須檢索少量的節點才能找到給定的密鑰。例如,一個10,000,000個密鑰的B樹(每個節點有50個密鑰)從不需要檢索多於4個節點來查找任何密鑰。 B樹是一種索引的特殊數據結構格式,允許快速訪問索引中的數據。該數據結構的一個屬性是索引總是平衡的。這意味着最低級別的每個節點是等距的從最頂端的節點或樹的根節點開始,並且索引的每一側具有相同數量的節點。最低級別處的節點被稱爲葉節點。所有其他節點被稱爲分支節點。分支點到其他分支或葉節點。葉節點存儲索引列的值和指向具有這些值的不同行的rowid。 實際分佈將取決於B樹中每個值範圍內的數據值的數量,總體目標是減少爲達到特定值而必須穿過的必需水平的數量。 B樹結構的優點是:
簡化的答案是,如果您的SQL在該字段上使用LIKE語句,那麼使用BTREE索引應該會超過散列索引。如果您對該字段使用等於(=)的語句,則使用散列索引。
你想要的MySQL手冊頁是[here](http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html)。 – dnagirl 2009-11-06 14:29:10