zoukankan      html  css  js  c++  java
  • 数据库系列(一)之 底层

    文本形式

         在数据库中,数据都是以文本形式保存。

      为了方便读取,数据必须分成记录,每一条记录的长度规定为等长。例如你的数据库规定每条记录的长度是1KB,那么每条都是数据长高度都是1KB,从第10条开始,记录的开始位置就是10KB。

      大多数时候,我们不知道某一条记录在第几个位置,只知道主键(primary key)的值。这时为了读取数据,可以一条条比对记录。这样的比对没有查找的方法,效率会太低。可以用一些快速查找发去查找到相应的数据。在实际应用中,数据库往往采用B树格式储存数据。

    B树

         首先介绍二叉树,因为B树从二叉树发展而来。

         它的查找效率非常高,有3个特点。

    a)每个节点最多只有两个子树

    b)左子树都为小于父节点的值,右子树都为大于父节点的值

    c)在n个节点中找到目标值,一般只需要log(n)次比较

    1557588329(1)

          尽管二叉树的查找效率非常高,但是在数据结构中并不适合,因为它的查找效率与层数相关。越处在下层的数据,就需要越多次比较。也就是说n个数据需要n次比较才能找到目标值。对于数据库来说,每进入一层,就要从硬盘读取一次数据,这导致非常慢。因为硬盘IO操作是很浪费时间的,数据库读取硬盘的次数越少越好。

          B树是对二叉查找树的改进。它的设计思想是,将相关数据尽量集中在一起,以便一次读取多个数据,减少硬盘操作次数。

    clipboard

     

    B树的特点有三个

    a)一个节点可以容纳多个值。比如上图中,最多的一个节点容纳了4个值。

    b)除非数据已经填满,否则不会增加新的层。也就是说,B树追求"层"越少越好。

    c)子节点中的值,与父节点中的值,有严格的大小对应关系。一般来说,如果父节点有a个值,那么就有a+1个子节点。比如上图中,父节点有两个值(7和16),就对应三个子节点,第一个子节点都是小于7的值,最后一个子节点都是大于16的值,中间的子节点就是7和16之间的值。

    这种数据结构,非常有利于减少读取硬盘的次数。假定一个节点可以容纳100个值,那么3层的B树可以容纳100万个数据,如果换成二叉查找树,则需要20层!假定操作系统一次读取一个节点,并且根节点保留在内存中,那么B树在100万个数据中查找目标值,只需要读取两次硬盘。

     

    索引

      数据库以B树格式储存,只解决了按照"主键"查找数据的问题。如果想查找其他字段,就需要建立索引(index)。

      所谓索引,就是以某个字段为关键字的B树文件。假定有一张"雇员表",包含了员工号(主键)和姓名两个字段。可以对姓名建立索引文件,该文件以B树格式对姓名进行储存,每个姓名后面是其在数据库中的位置(即第几条记录)。查找姓名的时候,先从索引中找到对应第几条记录,然后再从表格中读取。

      这种索引查找方法,叫做"索引顺序存取方法"(Indexed Sequential Access Method),缩写为ISAM。它已经有多种实现(比如C-ISAM库和D-ISAM库),只要使用这些代码库,就能自己写一个最简单的数据库。

     

    备注:一些名词解析来源于网络。

     

    可以关注本人的公众号,多年经验的原创文章共享给大家。

  • 相关阅读:
    Hadoop入门
    Redis缓存分布式高可用架构原理
    ES分布式搜索引擎架构原理
    Java锁,多线程与高并发,JUC并发包
    图算法--拓扑序列
    数据结构--数组模拟队列
    数据结构--数组模拟栈
    数据结构--数组模拟双链表
    数据结构--数组模拟单链表
    基础算法--双指针
  • 原文地址:https://www.cnblogs.com/alunchen/p/11264858.html
Copyright © 2011-2022 走看看