zoukankan      html  css  js  c++  java
  • HBase 索引创建

    本文参考了文“mysql索引背后的数据结构及算法原理”,之所以还要摘录,主要是为了形成hbase索引研究的开篇,弄明白什么索引的本质,如有版权问题,请及时通知。

    索引的本质

    索引是帮助mysql高效获取数据的数据结构。索引属于数据结构的一种。

    在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这个数据结构就是索引。

    例子:

        图1展示一种可能的索引。左边是数据,一共2列,共7条记录,最左边是数据记录的物理地址(逻辑上相邻的记录在磁盘上并不一定是物理相邻的)。为了加快col2的查找,维护一共右边的二叉树,每个节点包含索引键值和一个指向数据库物理地址的指针,这样就可以运用二叉树在O(log2n)的复杂度内获取数据。

    B-Tree和B+Tree

    目前大部分数据库系统和文件系统都采用B-Tree或其变种B+Tree作为索引结构。

    B-树定义:B-树是一种平衡的多路查找树。一颗m阶的B-树,或为空树,或为满足下列特征的m叉树:

    ⑴每个节点最多有m棵子树;

    ⑵若跟节点不是叶子节点,则至少有2棵子树;

    ⑶除跟之外的所有非终端节点至少有[m/2]棵子树;

    ⑷所有非重点节点包含以下信息:(n,K1,A1,K…,Kn,An)其中:

       Ki(i=1,…,n)为关键字,且Ki<Ki+1

       Ai(1=1,…,n)为指向子树跟节点的指针,且Ai-1所指示子树中所有节点的关键字的值都小于Ki,Ai所指示子树所有节点的关键字的值都大于Ki

    ⑸所有的叶子节点都出现在同一层上

    如:(m=3)的B-树

     

    B-树索引,从根节点开始,对节点内关键字进行二份查找,如果命中,则结束,否则进入查找关键字所属范围的儿子节点,重复,知道对应的儿子节点指针为空或已经是叶子节点。

    B-树特征:

    ⑴关键字集合分布在整棵树中;

    ⑵任何关键字出现且只出现在一个节点中;

    B+树:B-树的一种变型树,它与B-树的差异在于:

    ⑴有n棵子树的结点含有n个关键字;

    ⑵所有的叶子节点包含全部关键字信息,及指向这些关键字的指针,且叶子节点之间是自小而大顺序链接;

    ⑶所有非叶子节点仅包含其子树最大(或最小)关键字。

    通常B+树有2个头指针,一个指向头指针,一个指向关键字最小的叶子节点。下图为一个B+树的示例图:

    B+树索引,在查找时,若非叶子节点的关键字等于给定值,并不终止,而是继续向下,直至叶子节点。

    一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存在磁盘上,索引查找过程中就要产生磁盘I/O操作,因此索引要尽量减少查找过程的I/O存取次数。

    主存存储原理

    目前计算机的主存基本都是随机读取存储器(RAM),下图展现了一个主存模型:

           

     

    主存是一系列的存储单元组成的矩阵,每个存储单元存储固定大小的数据。每个存储单元有唯一的地址,通过行地址和列地址可以唯一定位一个存储单元。当系统需要读取主存时,则将地址信号放在地址总线上传给主存,主存读到地址信号,解析信号并定位到制定的存储单元,然后将此存储单元上数据放在数据总线上,供其他部件读取。写主存类似,系统将要写入的地址和数据分别放在地址总线和数据总线上,主存读取2个总线的内容,做相应的写操作。

    磁盘存取原理

    索引检索需要磁盘IO,磁盘IO存在机械运动耗费,因此磁盘IO的时间消耗是巨大的:

             

       

    一个磁盘由大小相同且同轴的圆盘组成,圆盘可以转动。在磁盘的一侧有磁头支架,磁头支架固定一组磁头,每个磁头负责存取一个磁盘的内容,磁头不能运动,但可以沿半径方向运动。

          

    磁盘被划分为一系列同心环,圆心是磁盘的中心每个同心环叫做一个磁道;磁道被沿半径划分为一个个小的段,叫扇区。每个扇区是磁盘的最小存储单位。

    Mysql索引实现

    1、MyISAM索引实现

    MyISAM引擎使用B+树作为索引结构,叶子节点的data域存放的是数据记录的地址,如下:

     

    数据库记录存在磁盘的一块地方,索引指示数据库每条记录的存放地址,从索引查询到地址后,直接从该处读取就可以获得数据。此类型索引,主索引和辅助索引在结构上并没有任何区别,指示主索引要求key是唯一的,而辅助索引key可以是重复的。

    2、InnoDB索引实现

    InnoDB也使用B+tree作为索引结构。但是⑴节点位置存放的不是数据地址,而是记录值,如下:

    上图中叶子节点中包含完整的数据记录。

    ⑵辅助索引的data域存放的是主键位置而不是地址,如下:

    这种索引使得按主键的搜索十分高效,但辅助索引的搜索需要2遍索引。

    转自:http://smurfs.iteye.com/blog/1299976

  • 相关阅读:
    测试某个方法的执行时间
    DataTable与DataGridView绑定
    《认知与设计——理解UI设计准则》笔记(7) 我们的注意力有限,记忆力也不完美
    常用软件收集
    通过反射得到某个实体的属性值
    获取某个字段的最大值
    C# ServerVariables参数说明
    C# 将网址转换为16进制可用网址,防盗链,%%
    不加修改权限的前提,要分辨出那些图片是删除不用的
    C# Winform 域名得到(查询)(服务器所在) IP  cs
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205199.html
Copyright © 2011-2022 走看看