MySQL中B-Tree引索和Hash引索的区别?
MySQL中B-Tree引索和Hash引索的不同:1、B-Tree引索支撑最左前缀匹配原则,而Hash引索不支撑;2、MyISAM和InnoDB都支撑B-Tree引索,而Hash引索只要Memory和NDB引擎索引支撑。
Hash索引
Hash 索引构造的非凡性,其检索效力非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能拜访到页节点这样屡次的IO拜访,所以 Hash 索引的查询效力要远高于 B-Tree 索引。
大概许多人又有疑问了,既然 Hash 索引的效力要比 B-Tree 高许多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效力高,但是 Hash 索引本身由于其非凡性也带来了许多限制和弊端,主要有以下这些。
(1)Hash 索引仅仅能知足"=","IN"和"<=>"查询,不克不及使用范畴查询。
由于 Hash 索引比力的是停止 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不克不及用于基于范畴的过滤,由于经过响应的 Hash 算法处置之后的 Hash 值的大小关系,并不克不及包管和Hash运算前完全一样。
(2)Hash 索引没法被用来幸免数据的排序操纵。
由于 Hash 索引中存置的是经过 Hash 运算之后的 Hash 值,并且Hash值的大小关系并不必然和 Hash 运算前的键值完全一样,所以数据库没法利用索引的数据来幸免任何排序运算;
(3)Hash 索引不克不及利用部分索引键查询。
关于组合索引,Hash 索引在运算 Hash 值的时候是组合索引键合并后再一起运算 Hash 值,而不是独自运算 Hash 值,所以通过组合索引的前面一个或几个索引键停止查询的时候,Hash 索引也没法被利用。
(4)Hash 索引在任何时候都不克不及幸免表扫描。
前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存置于一个 Hash 表中,由于不一样索引键存在雷同 Hash 值,所以即便取知足某个 Hash 键值的数据的记载条数,也没法从 Hash 索引中直接完成查询,还是要通过拜访表中的实际数据停止响应的比力,并得到响应的结果。
(5)Hash 索引碰到大量Hash值相等的状况后机能并不必然就会比B-Tree索引高。
关于选中性比力低的索引键,假如创立 Hash 索引,那么将会存在大量记载指针信息存于统一个 Hash 值相关联。这样要定位某一笔记录时就会非常费事,会白费屡次表数据的拜访,而造成团体机能低下。
B-Tree索引
B-Tree 索引是 MySQL 数据库中使用最为频繁的索引类型,除了 Archive 储备引擎之外的其他所有的储备引擎都支撑 B-Tree 索引。不仅仅在 MySQL 中是如此,实际上在其他的许多数据库治理系统中B-Tree 索引也一样是作为最主要的索引类型,这主如果由于 B-Tree 索引的储备构造在数据库的数据检
索中有非常优良的展现。
一样来说, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的构造来储备的,也就是所有实际需要的数据都存置于 Tree 的 Leaf Node ,并且到任何一个 Leaf Node 的最短途径的长度都是完全雷同的,所以我们大家都称之为 B-Tree 索引当然,大概各种数据库(或 MySQL 的各种储备引擎)在存置本人的 B-Tree 索引的时候会对储备构造稍作革新。如 Innodb 储备引擎的 B-Tree 索引实际使用的储备构造实际上是 B+Tree ,也就是在 B-Tree 数据构造的根基上做了很小的革新,在每一个
Leaf Node 上面出了存置索引键的相关信息之外,还储备了指向与该 Leaf Node 相邻的后一个 LeafNode 的指针信息,这主如果为了加快检索多个相邻 Leaf Node 的效力思考。
引荐教程:《MySQL教程》
以上就是MySQL中B-Tree引索和Hash引索的不同?的具体内容,更多请关注百分百源码网其它相关文章!