BTREE的优点是什么?

34

我创建索引时没有使用USING BTREE子句。使用BTREE索引有什么优势吗?

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

2
你需要的MySQL手册页面在这里 - dnagirl
5个回答

56

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

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

现在...有些情况下,使用替代索引类型可能会提高性能。有时(相对较少的情况下),HASH索引可能有所帮助。请注意,创建HASH索引时,也会生成BTREE索引。这部分是因为哈希索引只能解决等式谓词。 (例如,无法处理WHERE Price>12.0这样的条件)。

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

编辑:(在搜索可以使用备用索引类型的情况下)
实际上,RTREE索引的情况相当简单。这些仅在MySQL中与"空间"数据库一起使用,即包含Geo位置上下文(如GIS模型中的Point和其他对象)的数据库。

HASH索引更加通用(不限于特定应用程序或数据类型),通常可以按照哈希的直觉理解来得出何时会优于老但可靠的BTREE。如前所述,这意味着通常使用等式谓词搜索的列。我猜测相对较短的查找表等可能会受益,具体取决于MySQL中的有效实现。

1
我们如何强制MySQL仅创建哈希索引而不是B树索引,如果我们不需要排序?(例如,一个不需要排序的主键) - Pacerier

29

BTREE是默认的索引方法。您可以放心地忽略它。


11
这要看存储引擎而定。 - Svetlozar Angelov
1
对于所有的存储引擎来说,这是不正确的。 - RC.

8

这取决于你使用的存储引擎。对于大多数情况,默认为BTREE,因此指定它并不会对任何事情产生改变。对于存储引擎如MEMORY/HEAP和NDB,默认使用HASH索引。

更多信息可以在这里找到。

无论是B-tree还是HASH索引从性能角度是否适合您,取决于数据和您如何访问它。如果您知道查询将针对一行或散列的单个行,则HASH索引可能很有用。除此之外,我通常更喜欢BTREE索引,因为数据已排序,因此使范围查询和返回多行的查询更加高效。


3
搜索平衡树意味着所有叶子节点都在同一深度上。没有指针开销,事实上,即使更大的B树也可以保证只需检索少量的节点即可找到给定键值。例如,一个有1000万个键和每个节点50个键的B树永远不需要检索超过4个节点才能找到任何键值。B树是一种特殊的数据结构格式,用于索引,允许快速访问索引中的数据。这种数据结构的一个特性是索引始终是平衡的。这意味着最底层的每个节点与最顶层的节点或树的根节点的距离相等,并且索引的每一侧具有相同数量的节点。最底层的节点称为叶节点。所有其他节点都称为分支节点。分支指向其他分支或叶节点。叶节点存储索引列的值和指向具有这些值的唯一行的rowid。
实际分布取决于B树中每个值范围内的数据值数目,整体目标是减少必须遍历的级别数以获取特定值。B树结构的优点是:
  1. 所有叶块的深度(值的数量)相同。
  2. B树的高度通常非常小。在某些情况下,根节点是唯一的叶节点,高度为1。随着表中插入更多行,索引必须增长以适应此情况。但即使在具有超过100万行的表中,B树索引的高度通常也为3。在最大的表格中,高度可能只有4.这意味着即使对于最大的表格,仅需要4个块即可找到您要查找的行的rowid,这非常有效率。
  3. 在随机输入数据的情况下,B树会自动保持平衡。实际上,无论输入什么数据,B树都会保持平衡。
  4. B树索引的所有块都是四分之三满的(平均值),允许插入而无需重建。
  5. B树为所有类型的选择提供出色性能。
  6. 在B树结构中,插入、更新和删除往往是高效的。
  7. 即使对于从小到大的表格,B树的性能仍然保持最佳。

1
简单地说,如果您的SQL语句在该字段上使用LIKE语句,则使用BTREE索引应该优于Hash索引。如果您对该字段使用等于(=)语句,请使用Hash索引。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接