【发布时间】:2010-12-13 20:39:09
【问题描述】:
我创建没有USING BTREE 子句的索引。使用 BTREE 索引有什么好处吗?
CREATE INDEX `SomeName` USING BTREE ON `tbl_Name`(`column_name`);
【问题讨论】:
-
你想要的 MySQL 手册页是here。
标签: mysql b-tree database-indexes
我创建没有USING BTREE 子句的索引。使用 BTREE 索引有什么好处吗?
CREATE INDEX `SomeName` USING BTREE ON `tbl_Name`(`column_name`);
【问题讨论】:
标签: mysql b-tree database-indexes
简单的答案是,如果您的 SQL 在该字段上使用 LIKE 语句,那么使用 BTREE 索引的性能应该优于哈希索引。如果您对该字段使用等于 (=) 语句,请使用哈希索引。
【讨论】:
搜索平衡树意味着所有的叶子都在相同的深度。没有跑道指针开销。事实上,即使是更大的 B 树也可以保证必须检索少量节点才能找到给定的键。例如,包含 10,000,000 个键且每个节点有 50 个键的 B 树永远不需要检索超过 4 个节点来找到任何键。 B树是索引的一种特殊数据结构格式,允许快速访问索引中的数据。这种数据结构的一个属性是索引总是平衡的。这意味着最低级别的每个节点都是等距的从最顶层的节点或树的根节点开始。并且索引的每一侧都有相同数量的节点。最低级别的节点称为叶节点。所有其他节点称为分支节点。分支点到其他分支或叶节点。叶节点存储索引列的值和指向具有这些值的不同行的 rowid。 实际分布将取决于 B 树中每个值范围内的数据值的数量,总体目标是减少为达到特定值而必须遍历的所需级别的数量。 B树结构的优点是:
【讨论】:
首先,根据使用的存储引擎,您可能别无选择(例如 InnoDB 专门使用 BTREE 作为其索引)。
另外,BTREE 是大多数存储引擎的默认索引类型。
现在...在某些情况下,使用替代索引类型可能会提高性能。有(相对罕见的情况)哈希索引可能会有所帮助。请注意,当创建 HASH 索引时,也会生成 BTREE 索引。部分原因是哈希索引只能解析相等谓词。 (哈希索引无法处理 WHERE Price > 12.0 等条件)。
简而言之:继续使用 BTREE,无论是隐式(如果 BTREE 是所用存储的默认值),还是显式。了解其他类型的索引,以便了解它们的需求。
编辑:(在可能使用替代索引类型的搜索情况下)
实际上,RTREE 索引的情况相当简单。 MySQL 仅在 "SPATIAL" databases 的上下文中支持这些,即包含地理位置上下文的数据库,例如 GIS 模型中的 Point 和其他对象。
HASH 索引更通用(不限于特定的应用程序或数据类型),人们通常可以根据自己对哈希的直观理解来获得关于何时这些可能优于旧但忠实的 BTREE 的提示。如前所述,这意味着通常使用相等谓词搜索列。我猜测相对较短的查找表等可能会受益,这取决于 MySQL 中的有效实现。
【讨论】:
这取决于您使用的存储引擎。对于大多数人来说,BTREE 是默认设置,因此指定它并不会真正改变任何东西。对于 MEMORY/HEAP 和 NDB 等存储引擎,默认使用 HASH 索引。
更多信息可以找到here.
从性能角度来看,B 树或 HASH 索引是否对您有利取决于数据以及您访问它的方式。如果您知道您的查询将只针对一行或分散的单个行,那么 HASH 索引可能会很有用。除此之外,我通常更喜欢 BTREE 索引,因为数据是经过排序的,因此范围查询和返回多行的查询效率更高。
【讨论】:
BTREE 是默认的索引方法。您可以放心地省略它。
【讨论】: