Hello大家好,我是枫哥。今天跟大家整理了一些关于MySQL存储相关和存储引擎的知识点,分享给大家。

存储相关
1问:为什么MySQL把一行行数据存储到磁盘的时候要采取这种格式?直接像Java里面的序列化一样把很多行的数据做成一个大对象然后序列化一下写到磁盘文件里,取出来的时候直接反序列化下不香嘛?
1答:原因很多,比如:
因为不需要每次都获取全部数据,只获取其中一两个字段的话,按照现在的序列化方式,就可以计算出字段对应的偏移量来获取。
序列化方式也占用较大空间。MySQL的格式会节省很多空间占用。

2问:变长字段列表里的十六进制值为什么要逆序存储?
2答:这样可以使记录中位置靠前的字段和它们对应的字段长度信息加载到内存中时,位置距离更近,可能会提高高速缓存的命中率。

3问:为什么数据里的null值不直接存储为null,要搞个bitmap出来?
3答:举个最简单的例子:
在UTF-8编码下,一个英文字符是1个字节,"NULL"是四个字节 = 32位。字符串占用的空间是bit位存储占用的空间32倍。

4问:什么是行溢出?
4答:一个数据页大小16kb,若遇到varchar(65535)、text等这种大文本类型的,大小远大于16kb了,所以一个数据页放不下,需要多个数据页存储一行数据,缓存到buffer pool的缓存页里的时候也是多个缓存页,这就是行溢出。

存储引擎
5问:MySQL支持哪些存储引擎?
5答:
Innodb
MyIsam
memory
archive

6问:Innodb和MyIsam的区别?
6答:
Innodb支持事务,myisam不支持事务。
innodb支持外键,myisam不支持外键。
innodb支持mvcc,myisam不支持mvcc。
count(*) 时,myisam会很快,因为他保存了一个变量记录总数,直接获取,innodb需要遍历全表进行统计。
innodb支持表锁、行锁、间隙锁等,myisam只支持表锁。
innodb表必须有主键,即使没有的话,innodb也会以rowid做为主键,myisam可以没主键。
innodb按主键大小有序插入,而myisam按顺序插入。

7答:
innodb支持事务,所以会有一个mvcc的比较过程。
查询的时候,如果走了索引的话,innodb是聚簇索引,会有一个回表过程,即:先去非聚簇索引树中查询数据,找到数据对应的key后,再通过key回表到聚簇索引树找到最终的数据。而myisam直接就是非聚簇索引,查询的时候查到的最后结果不是聚簇索引树的key,而是磁盘地址,所以直接回查询磁盘的完整数据,无需回表。
innodb支持行锁,在检查锁的时候不仅要检查表锁,还要看行锁。

最近在更新过关斩将系列——java面试题,全力帮助小白突破面试大关,目前已经更新至第12篇感兴趣可以关注公众号IT枫斗者追更!干货满满!
往期推荐
过关斩将之路-Redis事务
过关斩将之路-Redis持久化
过关斩将之路—Redis主从集群过关斩将之路-Spring IOC原理
过关斩将之路-Spring原理
过关斩将之路-MySQL基础和日志相关过关斩将之路-MySQL事务&&锁&&MVCC
过关斩将之路-分布式相关
过关斩将之路-HR高频面试合集
过关斩将之路-网络基础篇




