BTREE的优势?

时间:2009-11-06 14:20:19

标签: mysql

我创建没有“USING BTREE”子句的索引。使用BTREE索引有什么好处吗?

CREATE INDEX `SomeName` USING BTREE ON `tbl_Name`(`column_name`);

5 个答案:

答案 0 :(得分:41)

首先,根据所使用的存储引擎,您可能没有选择(例如InnoDB仅为其索引使用BTREE)。

此外,BTREE是大多数存储引擎的默认索引类型。

现在......有些情况下,使用其他索引类型可能会提高性能。当HASH索引可能有帮助时(相对罕见的情况)。请注意,创建HASH索引时,还会生成BTREE索引。这部分是由于哈希索引只能解析等式谓词。 (诸如WHERE价格> 12.0之类的条件无法通过哈希索引处理)。

简而言之:继续使用BTREE,无论是隐式的(如果BTREE是使用的存储的默认值),还是显式的。了解其他类型的索引,以便在需要时了解它们。

编辑:(在搜索可能使用其他索引类型的情况下)
实际上,RTREE索引的情况相当简单。这些仅在"SPATIAL" databases的上下文中受MySQL支持,即包含地理位置上下文的数据库,例如Point模型中的Point和其他对象。)

HASH索引更通用(不限于特定的应用程序或数据类型),并且通常可以遵循一个人对哈希的直观理解,以获得关于何时这些索引可能胜过旧但忠实的BTREE的提示。如前所述,这意味着通常使用相同谓词搜索的列。我猜测相对较短的查找表等可能会受益,具体取决于MySQL中的有效实现。

答案 1 :(得分:16)

BTREE是默认的索引方法。你可以安全地省略它。

答案 2 :(得分:7)

这取决于您使用的存储引擎。对于大多数人来说,BTREE是默认值,因此指定它并不会真正改变任何东西。对于MEMORY / HEAP和NDB等存储引擎,默认情况下默认使用HASH索引。

可以找到更多信息here.

从性能角度来看,B树或HASH索引是否对您有利,取决于数据以及您如何访问它。如果您知道您的查询将准确定位一行或分散各行,则HASH索引可能很有用。除此之外,我通常更喜欢BTREE索引,因为数据已经排序,从而使范围查询和返回多行的查询更有效。

答案 3 :(得分:3)

搜索平衡树意味着所有叶子都处于相同的深度。没有跑道指针开销。实际上,即使是更大的B树也可以保证必须检索少量节点才能找到给定的密钥。例如,10,000个密钥的B树,每个节点有50个密钥,从不需要检索超过4个节点来查找任何密钥。 B树是索引的一种特殊数据结构格式,允许快速访问索引中的数据。此数据结构的一个属性是索引总是平衡。这意味着最低级别的每个节点都是等距的从最顶层节点或树的根节点开始。索引的每一侧都有相同数量的节点。最低层的节点称为叶节点。所有其他节点称为分支节点。分支点到其他分支或叶子节点。叶子节点存储索引列的值和指向具有这些值的不同行的rowid。 实际分布将取决于B树中每个值范围中的数据值的数量,总体目标是减少必须遍历以获得特定值的所需级别的数量。 B树结构的优点是:

  1. 所有叶块具有相同的深度(值的数量)。
  2. B树的高度通常很小。在某些情况下,根节点是唯一的叶节点,高度为1.随着表中插入更多行,索引必须增长以适应这个。但是即使在行数超过100万的表中,B树idex通常具有高度3.在最大的表中,高度可能只有4.这意味着即使是最大的表,也只需要4个块找到你要寻找的行的rowid,这非常有效。
  3. 在随机输入数据的情况下,B树会自动保持平衡。事实上,无论输入什么数据,B树都会保持平衡。
  4. B树索引的所有块都是四分之三满(平均值),允许插入而不反复。 5.B-tree为所有类型的选择提供了出色的性能。 6.插入,更新和删除往往在B树结构中有效。 7.即使表格从小到大,B树性能也保持最佳。

答案 4 :(得分:1)

简化的答案是,如果您的SQL在该字段上使用LIKE语句,那么使用BTREE索引应该优于哈希索引。如果您对该字段使用等于(=)语句,请使用哈希索引。