数据库索引

·  阅读 497

Q:数据库中使用的索引结构是什么样的呢?MYSQL中索引是B+树,B树和B+树的区别是,为什么要用B+树?

1、B-Tree与B+Tree

1.1、B-Tree的数据结构 a、每个节点有n个key和n+1个point组成,叶子节点的指针均为null
b、key1左边的point只想的节点中所有的数据都小于data1,key1右边的指针中指向的节点中所有的数据都大于data1
查找数据过程中首先从根节点进行二分查找,若找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败

1.2、B+Tree的数据结构 a、每个节点由n个key和n个point组成,叶子节点包含所有的key以及key对应的数据
b、key1右边的point指向的节点中包含key1并且所有的节点都小于key7
查找数据的过程中首先从根节点开始二分查找,找到对应节点的话一直沿着point找到叶子节点,叶子节点包含有key对应的data。

R1、不同:B+Tree中每个节点的大小比B-Tree中节点的大小要小,每次加载到内存中的数量变多,I/O消耗变少
R2、使用B+树的原因:
IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高,树增高之后查找的次数就会变多,起不到方便查询的明显作用

  • 一般一个pageSize大小是16k

索引一般是以索引文件的形式存储到磁盘上,根节点常驻内存,每次访问一个节点的时候需要将节点从磁盘读取到内存中,因而索引的每个节点的大小设置为物理存储的一个页的大小最为合适,因为每次I/O导入的是一个页的大小

每次查找最差情况是读取h(树的高度)个节点,B-Tree的d(树的度)非常大,h就非常小。所以很多数据库操作引擎选择使用B-Tree(以及B-Tree的许多变种树)作为索引

2、InnoDB的索引

InnoDB在创建表的时候回要求表必须拥有一个主键,因为这个主键的存在使得数据库表文件就是一个以主键为索引的索引文件(聚簇索引)。

主键索引的实现方式采用的是B+Tree的数据结构实现的,叶子节点中包含的是主键对应的数据库表中一行完整的数据

数据库表中若存在第二个列手动设置为索引的时候,这个列的索引结构也是B+Tree数据结构,但是叶子节点保存的是这个列的数据以及对应的主键值

分类:
后端
标签: