MYSQL进阶路一:数据结构

Posted by DDW on 05-28,2020

mysql数据结构

一、数据结构概述

1、局部性原理

    科学家发现程序和数据的访问都有聚集成群的现象,在一个时间段内,仅使用其中一小部分(空间局限性),或最近访问过的程序代码和数据,很快又被访问的可能性很大(称时间局部性)。从此观点可以发现:磁盘预读(预读的长度一般为页的整倍数),也就是说,现在若想读取一个字节,不会精确读取到磁盘中的一个字节,只会读取到一个范围,称为页(在许多操作系统中,一页通常为4k),内存和数据中以页为单位交换数据。

2、索引的数据结构

  • 索引是帮助MYSQL高效获取数据的数据结构
  • 索引存储在文件系统中
  • 索引的文件保存方式于存储的引擎有关
  • 索引文件使用的数据结构为 哈希 二叉树 B树 B+树

二、哈希、二叉树、B树数据结构介绍

1、哈希表

    假设现在有ID NAME 两列数据进行哈希结构保存,现在有8个长度,数据除以8之后,剩下的余数当索引值,若有相同的余数,再建立链表。

id name
1 MA
2 ZHOU
3 CHEN
4 LIAN

缺点:
1.利用hash储存的话需要将所有的数据文件读取进内存,比较耗费内存空间
2.如果所有的查询都是等值查询,那么hash确实快,但是企业或者实际工作环境查找的范围数据更多
而不是等值查询,因此hash就不太合适。
hash表的索引格式:
image-1685272468678

2、二叉树、红黑树

二叉树、红黑树的使用格式
image-1685272480405
缺点:无论是二叉树还是红黑树,都会因为树的深度过深而造成IO次数变多,影响数据读取的效率。

3、B树

B树的数据结构:
image-1685272491882
缺点:
1.每个节点都有key,同时也包含data,而每个页储存空间都是有限的,如果data比较大,会导致每个节点储存的key变小。
2.当储存量很大的时候会导致深度较大,增大查询磁盘的IO次数,进而影响查询性能。

4、B+树(重点)

三层B+树的结构
image-1685272501642

  • 第一排称为页目录,每页的第一个对应页目录上的一个。
  • 与B树不同的是,页目录、子节点中无数据,根节点可能有,也可能没有数据。
  • 每一个节点储存一个主键和一个指针,指针指向相应的地址。

相关计算:

现在,假设一条数据大小为1kb,那么,计算两层B+树可粗存的数据量为
假设是varchar(8)+指针(6),那么页目录可储存(16*1024)/(8+6)=1170条数据
子目录可储存1170*16=18720条数据。
若是三层B+树结构,可储存1170*18720=21902400条。

3.两种mysql B+树数据结构
mysql lnnoDB–B+Tree,根节点直接直接放置数据。(聚簇索引)
image-1685272511964
mysql MylSAM–B+Tree,
image-1685272515980