MySQL存储引擎底层常见面试题

更多内容,前往 MySQL不同存储引擎底层真正存储结构进行查看

一、聚集索引、非聚集索引到底是什么东西?

       实际上InnoDB的主键索引就可以认为是个聚集索引
       聚集索引具体是什么意思呢?聚集索引也叫做聚簇索引,就是索引和表的数据列聚集在一起,放在一个文件里面去存储。
       实际上MyISAM的主键索引可以认为是非聚集索引
       非聚集索引具体是什么意思呢?非聚集索引也叫稀疏索引,就是索引文件是不包含索引所在行的数据,说白了就是索引和数据分开存放

二、为什么InnoDB必须要有主键?

      因为如果没有主键的话,无法用B+ Tree来组织存储。MySQL设计的InnoDB表数据文件就是如此,必须有B+ Tree来组织存储,所以就需要有个主键来帮忙组织存储data元素
     有热爱提问的小伙伴可能会有疑问,平时在工作中建表也没有指定主键,但是创建成功了。
      虽然没有明确的指定主键,但是MySQL会在InnoDB表里面找一行唯一索引作为主键索引。
      如果在表里面没有找到可以充当唯一索引的数据,会自动创建一个字段:rowid来作为主键,每插入一行就是给这个rowid生成一个整型数值(类似1,2,3,4,5),是由MySQL自主维护的,我们是看不到的
      总的来说,MySQL最终去找InnoDB表的某一行数据,必须要有一个唯一的标识字段来去找数据,MySQL底层设计如此

三、为什么InnoDB推荐使用整型自增主键?

      我们来拿UUID举反例说明,它是字符串且不是自增的(当前目前也是有公司使用UUID来存储主键的,一般是软件公司或者规模不大的公司,互联网公司一般不这么使用)
      从效率上来讲:由于InnoDB底层是B+ Tree,要定位到某个元素就必须从根节点一个层层查找,而在查找的过程中需要进行大量的索引元素大小的比较。大家可以想一下是整型的1 < 2比较速度快还是UUID的字符串“abc”<“123”(字符串可能是任何内容)比较速度快,显然整型比较要快的多,字符串在比较的时候会挨着一个个去比较,而且在比较的还需要先转换成ASII码,按照码表的顺序去比较,性能远远小于整型的比较。
      从占用存储空间上来看:UUID占用的存储空间要远大于整型。由于索引是存储在磁盘上的,它是占用磁盘存储空间的,不是隐形的东西,是实实在在存在的,最终还可能被加载到内存中,我们是希望索引占用的存储空间越小越好,所以也是整型更好一点
      至于为什么要使用自增的?
      如果使用的是整型自增的数据,按照索引B+ Tree的结构,叶子节点从左往右是依次递增的,也就是说,新增加的索引元素一般来说,在最后面追加元素即可。维护节点只是增加后面的新节点。
      如果使用的不是自增的数据,维护的代价比较大。假设有张数据表,现有的数据已经存储到对应的节点中去了,新增一个节点,如果之前的数据每个节点16KB都已存储满了,不能再存储新的元素了,而现在新增的元素刚好是需要插入到某个节点的中间位置(因为需要维护B+ Tree的特性,叶子结点依次递增的关系),节点就会进行分裂甚至还会进行一次平衡.比如,有以下原始数据:
在这里插入图片描述
现在插入4,刚插入如下图:
在这里插入图片描述
节点分裂:
在这里插入图片描述
节点平衡,最终状态:
在这里插入图片描述
所以,总的来说,自增数据,每次都是往后面插入数据,节点分裂和再平衡的情况出现的概率极低,如果不自增的话,时不时要往已经存储满的大节点中插入数据,会大量导致节点分裂和再平衡,效率是非常低的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值