能今天做好的事就不要等到明天。以梦为马,学习趁年华。
前言
没有任何文笔,都是写给自己看的,算是对知识的复习,本篇都是InnoDB的八股文知识。
一、MySQL存储引擎
1. InnoDB特点
优势:独立表空间,支持MVCC,行锁设计,提供一致性非锁定读,支持外键;
特性:插入缓冲,二次写,自适应哈希索引,预读;
存储方式:使用聚集的方式存储数据,每张表的存储都是按主键顺序存放。
2.MyISAM和InnoDB区别
(1)InnoDB支持事务,MyISAM不支持事务;
(2)InnoDB支持外键,MyISAM不支持外键;
(3)InnoDB不支持全文索引,MyISAM支持全文索引;
(4)InnoDB支持表、行(默认)级锁,MyISAM支持表级锁;
(5)InnoDB表必须有唯一索引,MyISAM表可以没有;
(6)Innodb存储文件有frm、ibd,Myisam是frm、MYD、MYI;
(7)InnoDB不保存表的具体行数,MyISAM用一个变量保存了整个表的行数。
3.存储引擎选择
MySQL5.5后默认支持InnoDB为存储引擎,你如果对MyISAM和InnoDB不是特别的熟悉,推荐你选择InnoDB存储引擎。
二、InnoDB页
1.InnoDB页简介
Page是Innodb存储的最基本结构,也是Innodb磁盘管理的最小单位,与数据库相关的所有内容都存储在Page结构里。
Page分为几种类型:数据页(B-Tree Node),Undo页(Undo Log Page),系统页(System Page),事务数据页(Transaction System Page)等;
每个数据页的大小为16kb,每个Page使用一个32位(一位表示的就是0或1)的int值来表示,正好对应Innodb最大64TB的存储容量(16kb * 2^32=64tib)。
2.InnoDB页结构
File Header ,表示页的一些通用信息,占固定的38字节。
Page Header ,表示数据页专有的一些信息,占固定的56个字节。
Infimum + Supremum ,两个虚拟的伪记录,分别表示页中的最小和最大记录,占固定的 26 个字节。
User Records :真实存储我们插入的记录的部分,大小不固定。
Free Space :页中尚未使用的部分,大小不确定。
Page Directory :页中的某些记录相对位置,也就是各个槽在页面中的地址偏移量,大小不固定,插 入的记录越多,这个部分占用的空间越多。
File Trailer :用于检验页是否完整的部分,占用固定的8个字节。
3.数据区
在MySQL的设定中,同一个表空间内的一组连续的数据页为一个extent(区),默认区的大小为1MB,
页的大小为16KB。16*64=1024,也就是说一个区里面会有64个连续的数据页。
连续的256个数据区为一组数据区。
4. 页分裂
关于页分裂问题,先要思考一下B+TREE结构和InnoDB索引设计问题。
在B+Tree中的叶子结点之间是通过双向链表关联起来的,则MySQL作者在InnoDB索引的设定中,要求主键索引是递增的,这样在构建索引树的时候才更加方便做二分查找。
基于以上了解,可以得出页分裂的目的就是保证后一个数据页中的所有行主键值比前一个数据页中主键值大。
结论:当主键不是递增时,才会出现页分裂问题,它将主键在页中重新做排序以方便B+Tree做二分查找,注意此过程开销非常大,则InnoDB表主键必须是递增的(不要选择uuid作为InnoDB表的主键)。