目录
背景
相关概念:
操作系统从硬盘中读取数据时是以块(block)为单位读取的。
- 硬盘的最小读写单元为扇区(sector),操作系统就将相邻的扇区组合在一起,形成一个块,然后再对块进行整体的操作。
- 读取数据时位于同一磁盘块中的数据会被一次性读取出来,而不是需要什取什么。
- 注意:块又称为磁盘块,磁盘块是操作系统虚拟出来的单位,并不是硬盘中的单位。
操作系统从内存中读取数据时是以页(page)为单位读取的。
- 操作系统将多个块组合在一起形成页,然后再对页进行整体的操作。
MySQL中InnoDB引擎:
- InnoDB引擎中也有页(page)的概念,页是其磁盘管理的最小单位,默认为16k。
- InnoDB每次从硬盘中读取数据时(InnoDb-->操作系统-->硬盘)都会将若干个地址连续的磁盘块一并读出并且组成页。
- InnoDB把数据写入内存时是以页为基本单位的,故在查询数据时如果一个页中的每条数据都能有助于定位数据的位置,将有助于减少磁盘I/O的次数,提高查询效率。
- 页的大小:
- 查看页的大小:show variables like 'innodb_page_size';
- 修改页的大小:可通过参数innodb_page_size将页的大小设置为4K、8K、16K。
B树
概念:
- B树(B-Tree,B表示Banlance)是为磁盘等外存设备设计的一种平衡多叉树,按照B树的结构存储的数据可以让系统高效的找到数据所在的磁盘块,减少磁盘的I/O次数,提高查询效率。
数据库记录结构:
- 定义数据库中的一条记录为一个二元组[key, data],key为记录的键值(关键字),对应表中的主键值,data为一条记录中除主键外的数据。
B树结构:
- B树的每个节点占用一个磁盘块的空间,每个节点上存储着多条记录(key和data)。
优点:
- 相比与AVL树(平衡二叉树),B树的高度要低很多,因此B树可以更快地找到数据所在的磁盘块,减少磁盘的I/O次数,提高查询速度。
缺点:
- 由于一个节点占用的存储空间(一个磁盘块)是有限的,当记录的data数据较大时,会导致一个节点存储的记录数很小,若存储的数据量很大,则B树高度就会很大,查询数据时就会进行很多次的磁盘I/O,最终导致查询的效率比较低。
举例:
- 3阶B树的一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。
- 3阶B树的结构图示(所有结点的子结点数的最大值称为B树的阶):
- 以根节点为例,关键字为17和35,P1指针指向的子树的数据范围小于17,P2指针指向的子树的数据范围为17~35,P3指针指向的子树的数据范围大于35。
- 模拟查找关键字29的过程:
- 根据根节点找到磁盘块1,读入内存【磁盘I/O操作第1次】,在区间(17,35)查找关键字29,找到磁盘块1的指针P2。
- 根据P2指针找到磁盘块3,读入内存【磁盘I/O操作第2次】,在区间(26,30)查找关键字29,找到磁盘块3的指针P2。
- 根据P2指针找到磁盘块8,读入内存【磁盘I/O操作第3次】,在磁盘块8中的关键字列表中找到关键字29。
- 总结:一共需要3次磁盘I/O操作,和3次内存查找操作。
- 3次磁盘I/O的操作是影响整个B树查找效率的决定因素。另外,内存中的关键字是一个有序表结构,可以利用二分法查找提高效率。
B+树
概念:
- B+树(B+Tree)是B树的一个变种,B+树适合用于存储数据库系统中的索引数据。
数据库记录结构:
- 定义数据库中的一条记录为一个二元组[key, data],key为记录的键值(关键字),对应表中的主键值,data为一条记录中除主键外的数据。
B+树结构:
- B+树的每个节点占用一页(InnoDB中的页)的空间,非叶子节点上只存储键值(关键字)和指针(指针存储的是子节点所在磁盘块的地址),叶子节点上存储着键值和数据data,即数据库中的记录是存储在叶子节点上的。这样可以保证每个节点存储大量的key,从而使得B+树的高度不会太高,查询数据时磁盘的I/O次数也不会太多,进而提高查询效率。
- 数据库中记录(叶子节点)是按照键值的大小顺序存放在同一层的叶子节点上,且所有的叶子节点之间是一种链式环结构。
优点:
- 查询效率高。
- 查询所有的数据都需要查询到叶子节点,故查询的性能比较稳定。
- 除了普通查找(从根节点开始查找)外,B+树还支持对于主键的范围查找。
缺点:
- 由于键会重复出现,因此相比与B树,B+会占用更多的空间。
举例:
- 4阶B+树的结构图示:
说明:
- 在数据库中,B+树的高度一般在2到3层。也就是说查找某一键值的记录,最多只需要2到3次IO开销。按磁盘每秒100次IO来计算,查询时间只需0.02到0.03秒。
- B+树索引并不能找到一个键值对应的具体行。b+树索引只能查到被查找数据行所在的页,然后数据库通过把页读入内存,再在内存中查找,最后得到结果。
- 在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点。
B树与AVL树(平衡二叉树)相比:
- AVL树一个节点只存储一条数据,B树的一个节点存储着多条数据,所以B树的高度比AVL树的高度更低。因此,B树可以更快地找到数据所在的磁盘块,减少磁盘的I/O次数,提高查询速度。
- 所以B树比AVL树更适合与文件系统中文件索引的结构。
B树和B+树的比较:
- B+树比B树查询速度更高,但是B+树占用的空间比B树多。
- B+树长用于对查询速度要求较高的场景:数据库索引、大型文件系统。
- 另外B+树支持范围查询,可以更好地满足数据库数据的查询。
- B树用于对查询查询速度一般的场景:常见的文件系统。