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
HBase 索引创建的更多相关文章
- 通过phoenix在hbase上创建二级索引,Secondary Indexing
环境描述: 操作系统版本:CentOS release 6.5 (Final) 内核版本:2.6.32-431.el6.x86_64 phoenix版本:phoenix-4.10.0 hbase版本: ...
- mysql 优化实例之索引创建
mysql 优化实例之索引创建 优化前: pt-query-degist分析结果: # Query 23: 0.00 QPS, 0.00x concurrency, ID 0x78761E301CC7 ...
- MongoDB索引创建(5)
索引创建 1:索引提高查询速度,降低写入速度,权衡常用的查询字段,不必在太多列上建索引 2. 在mongodb中,索引可以按字段升序/降序来创建,便于排序 3. 默认是用btree来组织索引文件,2. ...
- Lucene7.1.0版本的索引创建与查询以及维护,包括新版本的一些新特性探索!
一 吐槽 lucene版本更新实在太快了,往往旧版本都还没学会,新的就出来,而且每个版本改动都特别大,尤其是4.7,6,6,7.1.......ε=(´ο`*)))唉,但不可否认,新版本确实要比旧版本 ...
- 3.1-3.3 HBase Shell创建表
一.HBase Shell创建表 1.HBASE shell命令 ## hbase(main):001:0> create_namespace 'ns1' //创建命名空间:ns1 hbase( ...
- 索引-mysql索引创建、查看、删除及使用示例
mysql索引创建.查看.删除及使用示例 1.创建索引: ALTER TABLE用来创建普通索引.UNIQUE索引或PRIMARY KEY索引. ALTER TABLE table_name ADD ...
- solr索引创建流程
solr索引创建流程: 分词组件Tokenizer 分词组件(Tokenizer)会做以下几件事情(这个过程称为:Tokenize),处理得到的结果是词汇单元(Token). 1.将文档分成一个一个单 ...
- SQL Server获取索引创建时间&重建时间&重组时间
之前写过一篇博客"SQL Server中是否可以准确获取最后一次索引重建的时间?",里面主要讲述了三个问题:我们能否找到索引的创建时间?最后一次索引重建(Index Rebuild ...
- substr函数索引创建测试
技术群里小伙伴,沟通说一条经常查询的SQL缓慢,单表SQL一个列作为条件,列是int数值类型,索引类型默认创建. 一.SQL文本substr函数索引创建测试 ,) nm1 ')需求,将上述SQL执行速 ...
随机推荐
- GitHub无法访问或访问缓慢解决办法
缘由 由于众所周知的原因,Github最近无法访问或访问很慢.由于Github支持https,因此此次屏蔽Github采用的方法是dns污染,用户访问github会返回一个错误的IPFQ当然是一种解决 ...
- android的消息通知栏
在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等. ...
- 第一个lucene程序,把一个信息写入到索引库中、根据关键词把对象从索引库中提取出来、lucene读写过程分析
新建一个Java Project :LuceneTest 准备lucene的jar包,要加入的jar包至少有: 1)lucene-core-3.1.0.jar (核心包) 2) lucene- ...
- Retrofit 2.0 超能实践(四),完成大文件断点下载
作者:码小白 文/CSDN 博客 本文出自:http://blog.csdn.net/sk719887916/article/details/51988507 码小白 通过前几篇系统的介绍和综合运用, ...
- 5.1、Android Studio用Logcat编写和查看日志
Android Studio在Android Monitor中包含了一个logcat的tab,可以打印系统事件,比如垃圾回收发生时,实时打印应用消息. 为了显示需要的信息,你可以创建过滤器,更改需要显 ...
- Tomcat内核之类加载器工厂
Java虚拟机利用类加载器将类载入内存,以供使用.在此过程中类加载器要做很多的事情,例如读取字节数组.验证.解析.初始化等.而Java提供的URLClassLoader类能方便地将jar.class或 ...
- 手把手教你轻松实现listview上拉加载
上篇讲了如何简单快速的的实现listview下拉刷新,那么本篇将讲解如何简单快速的实现上拉加载更多.其实,如果你已经理解了下拉刷新的实现过程,那么实现上拉加载更多将变得轻松起来,原理完全一致,甚至实现 ...
- UNIX网络编程——套接字选项(setsockopt)
setsockopt的一些用法: close socket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockop ...
- 【嵌入式开发】嵌入式 开发环境 (远程登录 | 文件共享 | NFS TFTP 服务器 | 串口连接 | Win8.1 + RedHat Enterprise 6.3 + Vmware11)
作者 : 万境绝尘 博客地址 : http://blog.csdn.net/shulianghan/article/details/42254237 一. 相关工具下载 嵌入式开发工具包 : -- 下 ...
- python类:类方法和静态方法
http://blog.csdn.net/pipisorry/article/details/49516185 面相对象程序设计中,类方法和静态方法是经常用到的两个术语.逻辑上讲:类方法是只能由类名调 ...