精华内容
下载资源
问答
  • hash索引B+索引区别

    千次阅读 2019-06-26 16:30:24
    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。 可 能很多人...

    MySQL的btree索引和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 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。

     

     

    Hash索引

     

    mysql中,只有Memory(Memory表只存在内存中,断电会消失,适用于临时表)存储引擎显示支持Hash索引,是Memory表的默认 索引类型,尽管Memory表也可以使用B+Tree索引。Hash索引把数据以hash形式组织起来,因此当查找某一条记录的时候,速度非常快。但是因 为hash结构,每个键只对应一个值,而且是散列的方式分布。所以它并不支持范围查找和排序等功能。

     

     

     

    B+Tree索引

     

    B+Tree是mysql使用最频繁的一个索引数据结构,是Inodb和Myisam存储引擎模式的索引类型。相对Hash索引,B+Tree在查找单条记录的速度比不上Hash索引,但是因为更适合排序等操作,所以它更受欢迎。毕竟不可能只对数据库进行单条记录的操作。

     

    带顺序访问指针的B+Tree

     

    B+Tree所有索引数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都有指向相邻叶子节点的指针。

     

    这样做是为了提高区间效率,例如查询key为从18到49的所有数据记录,当找到18后,只要顺着节点和指针顺序遍历就可以以此向访问到所有数据节点,极大提高了区间查询效率。

     

    大大减少磁盘I/O读取

     

    数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点需要一次I/O就可以完全载入。

    转自:https://www.cnblogs.com/AndyAo/p/8183383.html

    总结:hash无法查询范围,并且对排序操作没有用

    展开全文
  • MySQL的B+索引和Hash索引的区别

    千次阅读 2017-08-06 22:07:36
    Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B+树索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,那为什么大家不都用Hash索引而还要使用B+树索引呢? 1. Hash索引...

    Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B+树索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,那为什么大家不都用Hash索引而还要使用B+树索引呢?

    1. Hash索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。因为经过相应的Hash算法处理之后的Hash值的大小关系,并不能保证和Hash运算前完全一样;

    2. Hash索引无法被用来避免数据的排序操作。因为Hash值的大小关系并不一定和Hash运算前的键值完全一样;

    3. Hash索引不能利用部分索引键查询。对于组合索引,Hash索引在计算Hash值的时候是组合索引键合并后再一起计算Hash值,而不是单独计算Hash值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash索引也无法被利用;

    4. Hash索引在任何时候都不能避免表扫描。由于不同索引键存在相同Hash值,所以即使取满足某个Hash键值的数据的记录条数,也无法从Hash索引中直接完成查询,还是要回表查询数据;

    5. Hash索引遇到大量Hash值相等的情况后性能并不一定就会比B+树索引高。

    展开全文
  • 一、索引介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句...

    一、索引介绍

    1.什么是索引?

    一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到索引了。

    2.为什么要有索引呢?

    索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。可以理解成为排好序的快速查找数据结构。

    索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要(排序和查找)。
    索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。
    索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。

    二、索引的原理

        索引的目的在于提高查询效率,与我们查阅图书所用的目录是一个道理:先定位到章,然后定位到该章下的一个小节,然后找到页数。相似的例子还有:查字典,查火车车次,飞机航班等

     

         为了加快col2的查找,可以维护一个上面所示意的二叉查找树,每个节点分别包含索引键值和一个指向对应数据物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应数据,从而快速检索出符合条件的记录。

     

    二叉查找

    要了解索引,必须了解用于查找数据的二叉查找算法:

        二叉树只能查找已经排好序的数据。二分查找通过比较数组中间的数据与目标数据的大小,可以得知目标数据是在数组的左边还是右边。因此比较一次就可以把查找范围缩小一半。重复执行该操作就可以找到目标数据。

      但是长期的插入和删除可能会导致二叉树变成线性结构。实际使用的二叉搜索树都是在原有的二叉搜索树的基础上加上平衡算法,即“平衡二叉树”。节点分布均匀的平衡算法是平衡二叉树的关键,平衡算法就是一种在二叉搜索树中插入和删除节点的策略。

     

     

    B树和B+树

    B-tree

    B树是一种多路搜索树,节点的关键字和可以拥有的子节点数都有限制。

    树形结构:由根节(root)、分支(branches)、叶(leaves)三级节点组成,其中分支节点可以有多层。

    (阶的定义就是一个节点的子节点数目的最大值)

    1.假设一个M阶的B-tree,那么非叶子节点也就是根节点的子节点数就是[2,M];

    2.根节点中的关键字的个数为[1,m-1];

    3.非根节点及叶子节点的节点,至少有[m/2]个子节点(m/2数值向上取整);

    4.非根节点及叶子节点的节点,其关键字个数为[m/2-1,m-1](m/2-1中数值向下取整);

    4.在B-树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶子结点时,该k-1个关键字正好是k个孩子包含的关键字的值域的分划。

     

    如果是表格中其他数据:

     

    每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。以根节点为例,关键字为17和35,P1指针指向的子树的数据范围为小于17,P2指针指向的子树的数据范围为17~35,P3指针指向的子树的数据范围为大于35。

    模拟查找关键字29的过程:

    1. 根据根节点找到磁盘块1,读入内存。【磁盘I/O操作第1次】
    2. 比较关键字29在区间(17,35),找到磁盘块1的指针P2。
    3. 根据P2指针找到磁盘块3,读入内存。【磁盘I/O操作第2次】
    4. 比较关键字29在区间(26,30),找到磁盘块3的指针P2。
    5. 根据P2指针找到磁盘块8,读入内存。【磁盘I/O操作第3次】
    6. 在磁盘块8中的关键字列表中找到关键字29。

    分析上面过程,发现需要3次磁盘I/O操作,和3次内存查找操作。由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率。而3次磁盘I/O操作是影响整个B-Tree查找效率的决定因素。B-Tree相对于AVLTree缩减了节点个数,使每次磁盘I/O取到内存的数据都发挥了作用,从而提高了查询效率。

    B+Tree:

    与B-Tree相比,B+Tree有以下不同点:

    1.非叶子节点不存储data,只存储索引key;只有叶子节点才存储data。

    2.所有叶子节点之间都有一个链指针;

    3.数据记录都存放在叶子节点中。

    结构如下图:

     

     

    Mysql中B+Tree:在经典B+Tree的基础上进行了优化,增加了顺序访问指针。在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。这样就提高了区间访问性能:如果要查询key为从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率(无需返回上层父节点重复遍历查找减少IO操作)。

    为何mysql选取B+索引:

           结合操作系统存储结构优化处理: mysql巧妙运用操作系统存储结构(一个节点分配到一个存储页中->尽量减少IO次数) & 磁盘预读(缓存预读->加速预读马上要用到的数据).

    1.B+Tree 单个节点能放多个子节点相同IO次数,检索出更多信息。

    2.B+TREE 只在叶子节点存储数据 & 所有叶子结点包含一个链指针 & 其他内层非叶子节点只存储索引数据。只利用索引快速定位数据索引范围,先定位索引再通过索引高效快速定位数据。

    详解:Mysql设计利用了磁盘预读原理,将一个B+Tree节点大小设为一个页大小,在新建节点时直接申请一个页的空间,这样就能保证一个节点物理上存储在一个页里,加之计算机存储分配都是按页对齐的,这样就实现了每个Node节点只需要一次I/O操作。

    聚集索引和非聚集索引:

     

    下面是MySQL文档中关于索引的说明:文档说明

         每个InnoDB表有一个特殊的指数称为聚集索引所在的行的数据存储。通常,聚集索引是主键的同义词。从查询,插入性能最好,和其他的数据库操作,必须了解InnoDB使用聚集索引来优化每个表最常见的查询和DML操作。
         当你定义你的表的主键,InnoDB使用它作为聚集索引。为您创建的每个表定义一个主键。如果没有逻辑唯一的和非空的列或列集,添加一个新的自动增量列,它的值自动填充。
         如果你不确定你的表的主键、唯一索引,MySQL定位第一所有键列不为空,InnoDB使用它作为聚集索引。
    如果表没有主键或唯一索引InnoDB内部适用,生成一个隐藏的聚集索引为合成列包含行ID值gen_clust_index。行的ID,InnoDB分配在这样一个表中的行排序。行ID是一个6字节字段的单调增加,在插入新行。因此,行id命令的行在物理上是插入顺序。

          

           数据库中的B+Tree索引可以分为聚集索引(clustered index)和辅助索引(secondary index)。聚集索引的B+Tree中的叶子节点存放的是整张表的行记录数据;辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键。

    聚集索引和非聚集索引(辅助索引)的区别:      

    1.聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。

    2.  聚集索引表记录的排列顺序和索引的排列顺序一致,所以查询效率快,只要找到第一个索引值记录,其余就连续性的记录在物理也一样连续存放。聚集索引对应的缺点就是修改慢,因为为了保证表中记录的物理和索引顺序一致,在记录插入的时候,会对数据页重新排序。

    3.非聚集索引制定了表中记录的逻辑顺序,但是记录的物理和索引不一定一致,两种索引都采用B+树结构,非聚集索引的叶子层并不和实际数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针方式。非聚集索引层次多,不会造成数据重排。

    1. MyISAM索引实现:

    1)主键索引:

         MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。MyISAM的索引文件仅仅保存数据记录的地址。(底层存储结构: frm -表定义、 myi -myisam索引、 myd-myisam数据)

    2)辅助索引(Secondary key)

    在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。

    同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

    MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。

    2. InnoDB索引实现

    然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同.

    1)主键索引:

             MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

             叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

    2). InnoDB的辅助索引

         和聚集索引相比,辅助索引中叶子节点中并不包含行记录的全部数据。叶子节点除了包含键值以外,每个叶子节点的索引行还包含了一个书签(bookmark),该书签用来告诉InnoDB哪里可以找到与索引相对应的行数据。(也就是辅助索引中的叶子数据data)

            InnoDB 表是基于聚簇索引建立的。因此InnoDB 的索引能提供一种非常快速的主键查找性能。不过,它的辅助索引(Secondary Index, 也就是非主键索引)也会包含主键列,所以,如果主键定义的比较大,其他索引也将很大。如果想在表上定义 、很多索引,则争取尽量把主键定义得小一些。InnoDB 不会压缩索引。

          文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

          不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

     InnoDB索引MyISAM索引的区别:

    一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。

    二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。

    索引的优劣

    索引主要分为四种:普通索引、主键、唯一索引、复合索引。这边文章只是介绍了主键索引和普通索引的原理。

    优点:
    1.可以大大加快数据的检索速度,降低了IO成本。
    2.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
    3.通过索引列对数据进行排序,减少查询中分组和排序的时间。降低了CPU的消耗。
    4.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

    缺点:
    1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
    2.索引实际上也是一张表,保存了主键与索引字段并指向实体表记录。所以索引也需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚集索引那么需要的空间就会更大。
    3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

    具体在实际使用中一般mysql使用都是复合索引。在以后的文章里面将会具体总结。

    欢迎大家阅读及斧正(rwangnqian@126.com)


     

    展开全文
  • MySql中B+索引和ISAM索引介绍

    千次阅读 2013-01-22 20:10:47
    名词:索引顺序存取方法ISAM—Indexed Sequential Access Method 索引顺序存取方法(ISAM, Indexed Sequential Access Method)最初是IBM公司发展起来的一个文件系统,可以连续地(按照他们进入的顺序)或者任意...

    名词:索引顺序存取方法ISAM—Indexed Sequential Access Method

    索引顺序存取方法(ISAM, Indexed Sequential Access Method)最初是IBM公司发展起来的一个文件系统,可以连续地(按照他们进入的顺序)或者任意地(根据索引)记录任何访问。每个索引定义了一次不同排列的记录。现在这个概念用在许多场合:

    • 特指IBM公司的ISAM产品
    • 数据库系统中提供用户接口从数据文件中检索数据。
    • 通常指,数据库的索引,这种索引被大多数数据库所采用,包括关系数据库或其它。

    在ISAM系统,数据组织成有固定长度的记录,按顺序存储的。

    -------------------------------------------------------------------------

    首先介绍一些概念

    索引是在磁盘上组织数据记录的一种数据结构,它用于优化某类数据检索的操作。索引使得我们能够有效地检索满足索引的搜索码字段上的搜索条件的那些记录。可以在一个给定的数据记录集合上创建多个索引,每一个索引都有不同的搜索码,以支持那些不能被文件组织有效支持的搜索操作。

    我们使用术语数据项来指代存储在索引文件中的记录。搜索码值为k的数据项记为k*,包含有足够的信息以定位(一个或多个)搜索码值为k的数据记录。我们可以有效地搜索一个索引来找到想要的数据项,然后使用这些数据项来获得数据记录。(数据项 数据记录)

    基于树的索引——树型的数据结构

    构成形式:数据项按照搜索码值进行排列,并且维护一个层次化的搜索数据结构,以便将搜索定向到数据项所属的页面。

    图中显示了一个雇员记录文件,按照搜索码“年龄”组织成一个树结构的索引。该图中的每一个节点(例如,节点A,B,L1,L2)是一个物理页,并且检索一次节点就要涉及一次I/O。树的最下层,就是叶子层,包含数据项。在我们的示例中,这些数据就是雇员记录。

    这种结构使得可以用搜索码值有效地定为指定范围内德所有数据项。所有的搜索都开始与最顶端的节点,称其为根节点,然后非叶子层的节点的内容将搜索定位到正确的叶子页上。非叶子页包含按照搜索码值分开的节点指针。码值k左边的节点指针指向一个只含有小于k的数据项的子树。码值k右边的节点指针指向一个只含有大于或等于k的数据项的子树。

     

    现在考虑两种基于树型组织的索引结构:ISAM和B+树。

    ISAM树是一个静态索引结构,它在文件不频繁修改的情况下非常有效,但它不适合频繁增长和缩小的数据文件。

    B+树是一个能适应文件变化的动态结构。因为它能有效地适应变化,支持等值和范围查询。

    在ISAM和B+树结构中,叶子页包含数据项。为了方便起见,将把拥有搜索码值k的数据项表示为k*。非叶子页包含索引项,其形式为<搜索码值,页标识符>,它用于直接搜索需要的数据项(存储在叶子页中)。

    树索引介绍

    索引页的格式

     

    我们称形如<码,指针>的对为索引项。请注意每一个索引页中所含的指针都要比码的个数多一个,因为每一个码都作为其左右指针所指页面内容的分隔符。

    一个简单的索引文件数据结构如图所示

     

    索引顺序存取方法:

    索引顺序存取方法(ISAM)的数据结构如图所示。



    数据页   索引页    溢出页

    ISAM索引的数据项存放在树的叶子页和串链到叶子页的其他溢出页中。ISAM结构完全是静态的(除了溢出页,但它们只有很少),并且便于底层优化。

    每一个树节点是一个磁盘页,并且所有的数据存放在叶子页。当创建文件时,顺序分配所有叶子页并在搜索码值上排序,然后再分配非叶子级的页。如果随后对文件有一些插入操作,以至于多个项被插入到一个叶子页,使之超出一页,则需要分配另外的页,因为索引结构是静态的。这些另外的页是从溢出区分配的。页的分配如图所示

    插入、删除和搜索这些节本操作都可以直接出来。对于等值搜索,可以从根节点开始,通过把给定记录的搜索字段的值与节点中的码值相比较,确定沿哪一个子树继续搜索(搜索算法与B+树相同)。对于范围搜索,数据(或叶子)级的开始点的确定与上述相似,接着是顺序搜索数据页。对于插入和删除操作,通过搜索来确定合适的页,然后插入或删除记录,必要时增加溢出页。

    下面是一个例子。


    设想如图所示的树,所有的搜索从根开始。例如,为了定位码值为27的记录,因为27<40,所以,从根开始沿着左指针继续。接着沿着中间指针继续,因为20≤27<33。对于范围搜索,可以像等值搜索那样找到第一个满足条件的数据项,然后顺序搜索主叶子页(必要时页通过沿着来自主页的指针去搜索溢出页)。假设主叶子页是顺序分配的,这一假设是合理的,因为页的数目在创建树时是已知的,并且在随后的插入和删除中也不改变,所以,不需要“指向下一叶子页的” 指针。

    假设每一叶子页包含两个数据项。如果现在插入码值为23的记录,项23*属于第二个数据页,但该页已经包含20*和27*两项,已经没有空间了。在这种情况下,将增加一个溢出页,并把23*放入该溢出页。溢出页链很容易维护。例如插入48*,41*和42*将产生两页的溢出链。图1中的树经过所有这些插入后的状态如图2所示。

    溢出页与加锁考虑

    值得注意的是,一旦ISAM文件被创建,插入和删除只影响叶子页的内容。这样设计的结果是,如果大量插入操作作用于同一叶子,则产生很长的溢出页链。这些链非常影响搜索记录的时间,因为当搜索达到这个叶子时,溢出链页需要被搜索(尽管溢出链的数据能够保持排列顺序,但为了加快插入操作,它常常不保持顺序)。为了解决这个问题,树在开始创建时为每一页保留了20%的空闲空间。但是,一旦空闲空间被插入的记录填满,除非再次通过删除而获得释放的空间,否则就只有通过完全重组文件才能消除溢出链。

    只有叶子页被修改对于并发访问也有好处。当一页被访问时,会被申请者锁定,以保证它不被该页的其他用户并发修改。为了修改这一页,必须以“互斥”的方式锁定该页。加锁可能导致用户(准确地说是事务)进入等待存取该页的队列。队列是最大的性能瓶颈,尤其是当大量存取索引结构中接近根的页时。ISAM结构中,既然已经知道索引级的页从不修改,所以可以安全地忽略加锁步骤。不对索引级页加锁时ISAM优于B+树动态结构的一个重要优点。当数据分布和大小相对稳定而使得溢出链很少时,ISAM将优于B+树。

    B+树:一种动态索引结构

    像ISAM索引这样的静态结构存在如下问题:随着文件的增长将产生很长的溢出链,从而导致很差的性能。这个问题促进了更灵活的、能随时插入和删除而调整动态结构的发展。被广泛使用的B+树是一个平衡树,它的内节点用于指导搜索,叶子节点包含数据项。由于树结构需要动态增长和缩小,所以就不能像ISAM那样(ISAM的主叶子页的集合是静态的)简单地顺序分配叶子页。为了有效地搜索所有的叶子页,就不得不用指针把叶子页链起来。通过双向链表,可以很容易地从两个方向遍历叶子页序列。

    B+树的主要特征

    树上的操作(插入,删除)能保持的平衡

    如果能实现删除算法,则除根节点外,每一个节点都将保证最小50%的占有率【这里不是很理解什么是占有率】。但是,删除的实现通常是简单的定位数据项,并移走它,而不为保证50%的占有率而调整它,这主要是因为文件在典型情况下是增长而不是缩小。

    搜索记录需要从根开始遍历到合适的叶子。从到叶子的路径长度称为树的高度,因为是平衡树,所以从根到任意叶子的长度都是相同的(平衡树,高度相差不超过1)。

    下面将研究每个节点包含m个项的B+树,其中d≤m≤2d,d是B+树的一个参数,称为数的秩,它是树节点的度量。根节点是唯一不需要满足项数目要求的例外节点,它只需满足1≤m≤2d。

    B+树节点格式:

    B+树的节点的格式与ISAM的相同。有m个索引项的非叶子节点包含m+1个指向孩子的指针。指针Pi为指向所有码值K满足Ki≤K≤Ki+1的子树。而作为一个特殊情况,P0是指向所有码值小于K1的子树,Pm指向所有码值大于或等于Km的子树。对于叶子节点,项通常表示为k*。像ISAM一样,叶子节点(并且只有叶子节点)包含数据项。叶子页以双向链表的形式连接起来。所以,叶子形成一个序列,它能有效地解决范围查询的问题。

    B+树与ISAM对比

    如果存放记录的文件需要频繁地修改,并且是顺序存取的操作,维护数据记录作为数据项的B+树索引总是比维护排序文件有优势。通过付出存储索引项的空间的开销,可以获得所有排序文件的优点和有效地插入和删除效率。B+树典型地保持67%的空间占有率。B+树也由于其插入处理不需要溢出链而优于ISAM索引。但是,如果数据集大小和分布保持相对稳定,溢出链可能不是主要问题。在这种情况下,有两个优点支持ISAM:顺序分配叶子页(使大范围的扫描比B+树有效,因为B+树的页在长时间后可能在磁盘上不再有顺序,当不再有顺序之后,大范围的扫描,就会增加磁盘io)和比B+树低的加锁开销(ISAM索引节点不需要加锁)。在一般情况下,B+树比ISAM优势更明显。 

    --------------------------------------------------------------------------

    P31实际的B+树

    补充:

    a、检索一个节点就要涉及一次I/O,因此在搜索中出现的磁盘I/O数就等于从根节点到叶节点的路径长加上满足条件的数据项的叶子页的个数(实际上,根通常是在缓冲池中,因为他要被频繁地访问,所以对一个高度为3的树,其实只需要3次I/O)。

    b、非叶结点的平均孩子数称为数的扇出。

    P321、码压缩

    B+树的高度依赖于数据项的数目和索引的大小。索引项的大小决定一页能存放索引项的数目(成反比,每个索引越大,每页存放的索引数目就越少),即树的扇出数。既然树的高度与㏒扇出(数据项数)成正比,所以,使B+树的扇出数最大、高度最小是很重要的策略。

    索引项包含一个搜索码值和页的指针,所以其大小要依赖于搜索码值的大小。如果搜索码值非常大(例如一个很长的名字),一页(这里为什么一定是要放在一页里面呢?是为了减小io。如果同一个数据分散在两个页里面,那么取同一个数据就要取出两个数据页,也就是要两次io了。浪费了一次。)就不能放很多索引项,导致扇出数很小,树的高度很大。

    P33另一方面,索引项中的搜索码值仅仅用于知道搜索到达合适的叶子。如果需要对给定的搜索码值的数据项进行定位,只要把这个搜索码值与(从根到期望的叶子的路径上的)索引项的搜索码值相比较。在与索引级节点进行比较时,要找到包含索引码值k1和k2,并且期望码值k刚好落在k1和k2之间的两个索引项。为了完成这个过程,不需要在索引项中存储完整的搜索码值。

    例如,假设在一个节点内有两个邻近的索引项,它们的索引码值是David Smith和Devarakonda……。为了区别这两个值,只需要存储简短的形式Da和De就够了。

    P34rid上插入和删除的影响

    如果叶子页包含数据记录,即B+树是聚簇索引,那么诸如分裂、合并和重分布等操作将改变rid。回忆一下,rid的典型表达形式是(物理)页号和槽号的结合。这种模式在适当的页格式下允许记录在页内移动,但不能跨页移动,这对分裂操作也是一样的。所以,除非rid的选择独立于页号,否则,聚簇索引B+树的分裂或合并操作可能需要对同一数据上的其他索引进行补偿修改。

    对于任何动态聚簇索引,不管它是基于树或基于哈希的,都有类似的问题。当然,对于非聚簇索引则不会产生这个问题,因为只有索引项被移动。

    展开全文
  • B+树索引 B+树索引

    热门讨论 2009-01-06 08:32:56
    B+树索引 B+树索引 B+树索引 B+树索引 B+树索引 B+树索引
  • 前段时间被问到Hash索引B+tree索引的区别,一时间没回答上来,这边做下记录。 索引 索引是对数据库表中一列或多列的值进行处理后的一种结构,使用索引可快速访问数据库表中的特定信息。本文主要对Hash索引B+...
  • B+树索引

    千次阅读 2018-08-07 15:28:03
    B+树索引的构造类似于二叉树,根据键值快速找到数据,B+树中的B代表平衡(balance),B+树索引并不能找到一个给定键值的具体行,B+树索引只能找到被查找数据行所在的页,数据库把页读入到内存中,最后在内存中查找到...
  • InnoDB的B+树索引

    千次阅读 2017-11-28 18:52:36
    B+树索引其本质就是B+树在数据库中的实现,但是B+索引在数据库中有一个特点就是其高扇出性,因此在数据库中,B+树的高度一般都在2~3层,也就是对于查找某一键值的行记录,最多只需要2到3次IO,这倒不错。...
  • Mysql B+数索引分析

    千次阅读 2019-01-13 15:22:01
     B+数索引的构造类似于二叉树,根据 键值快熟查找数据,并且B+树中的B不代表二叉(Binary),而实代表平衡(balance),因为B+树是从最早的平衡二叉树演变而来的,但是B+树不是一个二叉树。B+树索引并不能找到一个...
  • MySQL中的B+树索引结构

    万次阅读 2021-08-08 19:11:01
    BB树(B-tree、B-树):是一种平衡的多路搜索树,多用于文件系统、数据库的实现。 B树的特点: 1个节点可以存储超过2个元素、可以拥有超过2个子节点;...的地址,叶子结点以上各层作为索引使用。
  • 文章目录前言B+树HashHash索引B+树索引的区别总结 前言 我们都知道在MySQL中索引的数据结构有两种,一种是Hash,另一种是BTree。在数据表中建立什么样的索引需要我们根据实际情况进行选择。 B+树 B+树结构示意图:...
  • MySQL hash索引B+Tree索引

    千次阅读 2018-12-22 15:48:46
    MySQL hash索引B+Tree索引 红黑树 BB+树 B+树是在B树的基础上进行改造的,它的数据都是叶子节点,同时叶子节点之间还加了指针以形成链表 索引对比 查询时间。B+ Tree为 O(log(n)),与树的高度有关;...
  • InnoDB存储引擎索引——B+树索引

    千次阅读 2018-01-06 21:26:00
    一、InnoDB存储引擎索引概述 * B+ 数索引 * 全文索引 ... B+ 树索引就是传统意义上的索引,这是目前关系型数据库系统中最为常用和最为有效的索引B+ 树索引的构造类似于二叉树,根据键值(Key Value)快速
  • 哈希索引B+树索引的区别

    千次阅读 2016-03-07 16:26:54
    逻辑区别 hash算法立刻定位 对应的hash筒的关键字 b+数可能会做3次IO 最大4次IO ...大数据的情况下b+索引比hash索引更高效 hash索引可以一次性定位到结果 只能精确查找 索引大的话维护成本更大 memory支持
  • B+树索引的使用

    千次阅读 2018-09-19 08:31:21
    1.B+树索引 1.1不同应用中B+树索引的使用 OLTP:查询操作只从数据库中取得一小部分的数据,一般可能都在10条记录以下,或者1条记录 是建立B+树索引最有意义的,否则即使建立了,优化器可能选择不使用索引。 OLAP:...
  • B+树索引与Hash索引的区别

    千次阅读 2019-07-25 10:20:42
    B+树索引与Hash索引的区别 B+(BTREE索引B+树索引写成了BTREE的写法: CREATE TABLE t( aid int unsigned not null auto_increment, userid int unsigned not null default 0, username varchar(20) not null ...
  • Hash索引B+树索引

    万次阅读 2020-09-15 23:03:56
    hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B+树底层实现是多路平衡查找树.对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,...
  • InnoDB存储引擎B+树索引介绍

    千次阅读 2017-08-06 16:27:06
    InnoDB存储引擎支持B+树索引、哈希索引、全文索引和空间索引,后两种很少用到,本文主要介绍B+树索引B+树是从最早的平衡二叉树(AVL)演变而来,但是B+树不是一个二叉树。B+中的B不代表二叉(Binary),而是代表...
  • MySql B+树索引

    千次阅读 2016-10-14 17:25:24
    数据库索引的数据结构: 采用的是B+Tree 文件系统采用的是B-Tree 为什么采用B+Tree 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。这样的话,索引查找过程中...
  • B树和B+树索引

    千次阅读 2018-05-16 10:25:03
    强烈建议参阅链接:...索引的实现通常使用B树及其变种B+树。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算...
  • MySQL中B+树索引的应用场景大全

    万次阅读 多人点赞 2021-06-28 17:26:17
    本文给大家讲解全值匹配、最左前缀原则、匹配列的前缀(比如like 'a%')、匹配列的中间字符或者后缀(比如like '%a%',like '%com')、匹配范围查找,确定扫描区间和边界、使用联合索引的场景、索引条件下推(Index ...
  • mysql中的B+树索引

    千次阅读 多人点赞 2018-12-31 13:30:03
    B+树索引B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉...
  • MySQL索引B+树索引

    千次阅读 2014-12-05 14:06:28
    B+树索引是是目前关系型数据库系统中查找最为常用和最为有效的索引B+树的索引构造类似于二叉树,根据键值(key Value)快速找到数据。 1、什么是B+树? 首先,B+树中的B并不是二叉树(binary)的意思,这里的B表示...
  • MySql中B+Tree索引原理

    千次阅读 2018-09-17 15:58:54
    B+树索引B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉...
  • 二、B+树索引实战

    千次阅读 2020-07-27 15:42:51
    二、B+树索引实战 索引的代价 空间上的代价 一个索引都为对应一棵B+树,树中每一个节点都是一个数据页,一个页默认会占用16KB的存储空间,所以一个索引也是会占用磁盘空间的。 时间上的代价 索引是对数据的排序,...
  • MySQL B+树索引和Hash索引的区别

    千次阅读 2017-08-30 00:27:38
    MySQL B+树索引和Hash索引的区别
  • B索引 1创建索引不指定unique ,btimap 那么表示创建的索引B索引. 2B树索引的组织结构类似一颗树,主要数据集中在叶子节点上,叶子节点包含索引列的值和记录行对应的物理地址rowid; 3默认会为主键创建一个...
  • MySQL索引原理及B-Tree / B+Tree结构详解

    万次阅读 2019-08-09 12:30:22
    MySQL索引原理及B-Tree / B+Tree结构详解 目录 摘要 数据结构及算法基础 索引的本质 B-Tree和B+Tree B-Tree B+Tree 带有顺序访问指针的B+Tree 为什么使用B-Tree(B+Tree) 主存存取原理 磁盘存取原理 ...
  • Mysql中的B索引B+树索引的区别?

    千次阅读 2020-11-23 11:54:32
    B树中,你可以将键和值存放在内部节点和叶子节点;但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值。 B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。 1 使用B树的好处 B树可以在内部...
  • B+Tree索引的背后

    千次阅读 2020-03-20 17:58:26
    本文只讨论InnoDB的B+Tree索引,因为这是MySQL引用最广泛的索引,至于哈希索引和全文索引本文暂不讨论。 聚集索引和二级索引 每个InnoDB表都有一个特殊的索引,称为聚集索引(有的翻译为聚簇索引) ,用于存储行数.....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 890,094
精华内容 356,037
关键字:

b+索引