关于DM索引的基础概念和用法

索引是什么?

  在学习索引之前,要先了解一下索引的基本概念,在官方解释中索引是一种单独的、物理的对数据库表中一列或多列的值进行排序和加速对表中数据行的检索而创建的一种存储结构,是某个表中一列或若干列值的集合和相应的指向表中这些值的数据页的逻辑指针清单。

  用大白话来讲,索引可以理解为就是书签,把表中的某一列或者某几列组合在一起,当我们需要这些列中的数据时,我们通过索引能够很快的找到需要的数据,如果没有索引,我们就要一页一页的翻,耗时费力。

DM中的索引

  达梦数据库用的树数据结构是b+ Tree,想要充分地理解b+树的概念,我们要先理解在b+树之前树数据结构,本节就从二叉查找树开始了解。本文插图都是网图,方便理解选择性插入。

  我们在使用索引时需要理解索引在数据库中是怎么工作的,比如二叉查找树,我们开始查找某个值时通过二叉查找会出现三种情况,大于、小于、等于,根据这三种情况,一般来讲左边的所有树分支是小于该节点的值,右边则是所有大于该节点的值,简单地用下图说明一下

 比如我们要找到0001这个数据,我们只需要根节点做一次比较,通过左边一条路直接找到数据,但是这些数据在二叉查找树是没有经过调整的,,左边就固定的几个数据,而右边却可以无限地增多,这会导致树的不平衡。因此在广大智慧群体的努力下,自平衡二叉查找树树就被引入了。

  在自平衡二叉树中,在对树进行修改时,可以动态的通过旋转来调整树的结构,保证了每个节点的左右两个节点深度都小于等于1。简单来讲,它可以调用树的结构并将数据选择性插入树中从而保证树的平衡,在插入或删除数据的时候需要频繁地调树结构,所以插入删除数据的数据是很低的,查找的时候效率却比较高,有些时候我们需要高速查找或插入,这个时候自平衡二叉树就不适用了,所以红黑树的概念应运而生。 红黑树对自平衡二叉树做了取舍处理,降低平衡要求的情况下,提高插入删除数据的效率,这样既保证了树的平衡,也保证了取数据的响应速度。

  在了解b树之前,要先了解一下叶子节点和非叶子节点的概念。叶子节点:在该节点下没有其他子节点;非叶子节点:在该节点下有若干个子节点。b树的存在是为了减少检索数据时的IO次数,io就是给磁盘发送指令,指令先通知磁盘从哪个扇区开始工作,以及需要读取往后连续的几个扇区,同时给出读或写的操作,这样的一次操作就是一次IO。以下是b树的树数据结构图:

 在每个节点上都会存储数据和到下一个节点的key值。key值可以指向下一个节点的位置,同样下一个节点也会存放数据和key值。根节点的key值是13,存储的数据就是两个方框,查找时通过和13比较选择左或右两个分支,比如到了key值为7的节点,它同样也有数据存储在节点上,以此类推。

  使用索引就是为了优化数据库的查询,也就是最大化地减少io的操作次数。最初了解到的二叉树每个节点存放一个数据,可以根据树的高度去调整节点,相比于没有索引的查询会减少很多查询时间,当数据量剧增,依靠二叉树去调整节点显然树的高度会非常的高,查找数据时也需要进行很多次io,查找的效率就会大大降低,所以就要去想办法降低树的高度并且增多节点,那么就可以利用b树。

  在二叉树中每个节点最多允许两个子节点,但是在b树中就不止,这样就可以增大每个节点所能容纳的数据量从而降低的树的高度,进而减少io操作次数。相同数量的key在B树中生成的节点要远远少于二叉树中的节点,相差的节点数量就等同于磁盘IO的次数。这样到达一定数量后,性能的差异就显现出来了。

  在IO层面上比如搜索key值为11的数据:

将数据从磁盘读入内存,并找到根节点-----一次IO

将11和13作比较找到了指向下一个节点的key值7并读取该节点---一次IO

将11和7作比较找到下一个节点,也就是目标数据---一次IO

综上可以得知找到需要的数据只需要进行三次IO

  当没有树结构时一次IO不仅会读取需要的数据同时也会把相邻的数据也读取出来,对于b树的精确的IO操作可以降低处理时间,根据查询的过程可以看出每次IO取到的数据都能够发挥作用从而就提高了查询效率。

  达梦数据库使用的b+树。b+树是b树的一种优化版本,以下为b+树的结构图:

  b树和b+树的区别就在于叶子节点,对于叶子节点和非叶子节点,叶子节点是能够存储数据的节点,数据记录都存在叶子节点中,而非叶子节点只存储了key值,这样可以加大每个节点存储的key值数量,也可以大大降低树的高度。而且在b+树中通常有两个指针,一个指向根节点,一个指向对象 的叶子节点,所有叶子节点之间是链式环结构也就是所有的数据形成了一个闭环。

  所以他们的优缺点也就体现出来了:

1.b+树每个非叶子节点存储的关键字更多,树的层级更少所以查询速度更快;

2.b+树查询速度更稳定,因为b+树中所有数据都存放在叶子节点中,所以不管查询什么数据所需要的io操作次数都是一样的;

3.b+树查询整个树的速度比b树更快,因为数据都在叶子节点,而b树每个节点上都会有数据,需要对每一层都扫描,所以耗费的时间也比b树更多

b树相对于b+树,它的优点是如果数据靠近根节点,那么查找的速度肯定是比b+树快的。

如何创建索引

创建普通索引:

CREATE INDEX index1 ON t1(id)
 

 在t1表上针对id列创建索引,如果在查找中想要用到索引那么在selelct语句中需要特别搜索id字段。

创建聚集索引:

CREATE CLUSTER INDEX index2 ON t1(id);

因为在DM中所有的表都是用B+树管理的,每个普通表都会有且仅有一个聚集索引,建表后可以创建新的聚集索引来重建表数据。

创建唯一索引:

CREATE UNIQUE INDEX index3 ON t1(id)

索引可以是唯一的或非唯一的。唯一索引可以保证表上不会有两行数据在列上具有相同的值,非唯一索引不会在列上有这个限制。以上就是索引的基本概念和基本使用了

关于技术交流分享请关注社区:达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值