MySQL数据库知识 - 数据存储

1. 在Innodb存储引擎中流传着这样一句话: 索引即数据,数据即索引。为啥这样说呢,是因为只要是Innodb存储引擎一定会给你创建一个聚簇索引,一般会用主键去进行索引目录项的创建,如果在创建表的时候没有制定主键,那么会找一个唯一列去创建聚簇索引,如果没有唯一列的话,会给你默认加一个隐藏的列。所以在创建表的时候一定要去制定主键。

2. 解释一下什么是: 索引即数据,数据即索引,是因为Innodb存储引擎里面的用户记录是放在聚簇索引的叶子节点上的。而MyISAM的数据是跟索引分开存放的,聚簇索引只是记录了用户记录的行号。聚簇索引是按照主键值的大小排列的B+树,而普通索引是按照索引列加主键值排列的B+树(一般是索引列加主键值,当是唯一索引的时候的用的只有索引列的值创建的B+树), 为啥普通索引的目录项要索引列加主键值? 是因为存在这么一个情况,当普通索引的索引列值重复时,有时候根据目录项存储的偏移量,无法具体算出接下来的记录应该存到哪个数据页上,这时候MySQL就开始发懵了, 所以这时候需要记录主键的值,如果索引列的值相同那么按照主键值的大小再进行排序。聚簇索引是只有数据页最底层的那层存储的用户记录,普通索引是B+数的叶子节点,非叶子节点(有时候也称为内节点)存储了索引列的值还有主键的值。

  3. 好了再给大家普及一下什么叫做目录项,什么叫作数据页? 首先MySQL的存储基本单位是页,每一个也的大小是16KB, 数据页里面存储了一条条的用户记录,这些用户记录通过单向链条的方式进行链接,当用户记录多了以后(每个组的记录不会超过8条)就开始在页里面进行分组,然后在将页的最后一条记录的地址偏移量提取出来(因为单向链表链接是按照主键值的大小排列的,所以最后一条也就是该组主键值最大的一条记录)放在页的尾部,这个地方就是Page Directory(页目录),页目录中华的这些地址偏移量称为槽。这些槽是从小到大的顺序排列的,当页内的槽多了以后我们该如果确定主键值例如: id = 13 的位置在哪呢? 根据每个槽记录的偏移量(例如记录了 3, 7 , 12 ,16), 我们可以通过二分法快速确定槽的位置,因为12 < 13 <  16 ,所以该条记录在第三个槽中,然后在从最小的一个记录开始往后遍历,因为规定了每个组内的记录至多不会超过8个,所以最多遍历7次 就可以确定数据的位置。这就跟我们的书本有些类似 ,当书的页数增多了以后 我们可以通过目录快速定位到要找的那一页。扯了这半天,好像还没有解释啥是目录项,啥是数据页? 好吧下面我给大家介绍一下,当我们的业务继续增加的时候,记录的数据也越来越多,一个页16KB的存储的空间不够了,继续开始另一个页面的存储,当页面越来越多,越来越多,发现找一个页面挺麻烦的, 所以干脆MySQL设计大叔将这些页面再按照页号,一个页中的最小的主键值,然后创建一个页(16KB大小)专门用来存储这些页号还有最小主键值,这就构成了第二层。其实在真实环境中,一个页可以存放的记录是非常多的,假设所有存放用户记录的叶子节点所代表的数据页可以存放100条用户记录,目录项可以存放1000条目录,

那么B+树只有1层,也就最多能存放100条用户记录;

如果B+树有2层,那么可以存放100* 1000 = 100000条记录

如果B+树有3层,那么可以存放 1000 * 1000 * 100 = 100000000条记录

是不是很神奇?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值