能今天做好的事就不要等到明天。以梦为马,学习趁年华。
文章目录- 前言
- 一、MySQL存储引擎
- 1. InnoDB特点
- 2.MyISAM和InnoDB区别
- 3.存储引擎选择
- 二、InnoDB页
- 1.InnoDB页简介
- 2.InnoDB页结构
- 3.数据区
- 4. 页分裂
- 三、总结
前言
没有任何文笔,都是写给自己看的,算是对知识的复习,本篇都是InnoDB的八股文知识。
一、MySQL存储引擎 1. InnoDB特点优势:独立表空间,支持MVCC,行锁设计,提供一致性非锁定读,支持外键;
特性:插入缓冲,二次写,自适应哈希索引,预读;
存储方式:使用聚集的方式存储数据,每张表的存储都是按主键顺序存放。
(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用一个变量保存了整个表的行数。
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表的主键)。
三、总结根据之前InnoDB页数据和B+TREE学习,可以得出B+TREE索引以下特点:
- 每个索引都对应一棵 B+ 树, B+ 树分为好多层,最下边一层是叶子节点,其余的是内节点。所有 用户记录 都存储在 B+ 树的叶子节点,所有 目录项记录 都存储在内节点。
- InnoDB 存储引擎会自动为主键(如果没有它会自动帮我们添加)建立 聚簇索引 ,聚簇索引的叶子节点包含 完整的用户记录。
- 我们可以为自己感兴趣的列建立 二级索引 , 二级索引 的叶子节点包含的用户记录由 索引列 + 主键 组 成,所以如果想通过 二级索引 来查找完整的用户记录的话,需要通过 回表 操作,也就是在通过 二级索引 找到主键值之后再到 聚簇索引 中查找完整的用户记录。
- B+ 树中每层节点都是按照索引列值从小到大的顺序排序而组成了双向链表,而且每个页内的记录(不论是 用户记录还是目录项记录)都是按照索引列的值从小到大的顺序而形成了一个单链表。如果是 联合索引 的 话,则页面和记录先按照 联合索引 前边的列排序,如果该列值相同,再按照 联合索引 后边的列排序。 通过索引查找记录是从 B+ 树的根节点开始,一层一层向下搜索。由于每个页面都按照索引列的值建立了
- Page Directory (页目录),所以在这些页面中的查找非常快。



