MYSQL基础

48 阅读3分钟

MYSQL基础

一、一些零散的知识点

索引的概念:索引是MYSQL高效获取数据的排好序的数据结构

MYSQL读取数据一般都是以页(page)为单位进行读取到buffer pool ,一个缓存页大小为16KB。

MYSQL底层一般使用b+树进行存储,大概结构如下:

image-20230722173513041

结构大概是:

非叶子节点不存储数据,只存储索引,所以在非叶子节点上可以放置很多索引,

然后叶子节点包含所有的索引字段

叶子节点用指针相连接,提高区间访问的性能。

关于data内容,聚集索引和非聚集索引又有点差异,聚集索引中的data是存放数据库中的每条记录,而非聚集索引,存放的是每条记录的主键。

如果表是InnoDB为存储引擎,则表结构存于.frm文件中,数据存于.ibd文件中

B+树叶节点有双向指针,主要是为了,主要是为了提高区间访问的性能。假如查询是范围查询,且涵盖内容较多,MYSQL底层可以先根据条件找到第一个page页,然后根据条件向左或者向右查询,不用多次返回到根节点来重新找数据

问题:为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?

存储数据时要用B+树,B+树来自于索引,如果没有主键,则从第一列找所有元素不相等的列来组织B+树,如果没有找到,则会建一个隐藏列类似RowId来构建B+树。推荐整型,是因为整型比大小效率高,也节省磁盘空间,自增的原因,主要是为了提高索引维护的效率。

由问题,可以顺便往下想: 根据用到B+树来存储数据,则可以推算出,三层B+树可以存储的数据量。一般主键可以取Long类型,8Byte,一个指针地址占用6Byte。一个page页一般是16KB,所以可以计算得一页只放索引的时候,可以放的数据量为,16*1024/14 = 1170左右,

所以一般两层非叶子节点,可以存储的索引个数为1170*1170=1368900个,已经到达百万级别,然后叶子节点中计算,一般一组数据往大的估计,存放1KB的数据,所以一个page页可以存放大概16条数据,所以可以估算得到三层B+树可以保存的数据量为2000W+。所以如果是四层B+树,则数据量为2000W乘以1170。

问题:为什么非主键索引结构叶子节点存储的是主键值?

存储主键值主要是有两个原因,

一是为了减少存储空间,因为当存储的还是原数据对比单个主键,占用空间会大得多

二是为了保证一致性,减少复杂度。这是因为,倘若对数据进行修改,如果非主键索引结构也是保存的原数据,则每一个索引结构中的数据都要进行修改,来保证一致性。但是当保存的是单个主键,则主要维护主键索引中的叶子节点数据结构,减少了复杂度。