MySQL存储引擎
存储引擎三大特征
-
数据结构 :B树、Hash表
-
存储介质 :磁盘、内存
-
支持功能 :事务、锁、外键、缓存等
InnoDB存储引擎
存储底层
InnoDB存储引擎的数据组织形式为B+树,这颗B+树上的每个节点都对应一个”块“。
磁盘中的数据默认以”块“为单位读取,MySQL默认块大小为16KB
当执行器直接从硬盘中读取数据时,每次以节点为单位读取一个块,进行大小判断,并产生一次磁盘IO。
因此,树的深度将直接决定每次读取数据的性能,如红黑树作为二叉树来说,深度过深,这也是InnoDB选择B+树作为数据存储结构的原因。
B+树的缺点
由于B+树中每个节点可以存储多个实体(主键或者全部数据),因此对表的增删操作将会导致节点变满/空。
默认负载因子50%时进行操作,当节点过”空“时,即存储数据很少,将会进行自底向上的节点合并操作。当节点过”满“时,也会进行自底向上的拆分操作。因此调整节点会对B+树性能带来一定影响。
存储结构
InnoDB存储结构主要分为内存区和磁盘区。
内存区
内存区中Log Buffer与日志相关,Buffer Pool则主要为了减少IO次数。
在内存与磁盘同步时,用户可以选择直接同步到磁盘,或者logBuffer写入Page Cache,然后由mysql自己写入磁盘
磁盘文件
MySQL的底层通过为每个数据库生成一个位于/var/lib/mysql
下的文件夹,这里我的数据库名为blog。
该参数也可通过@@datadir查看,注意该变量是只读变量,只有安装时才能设置
进入blog文件夹可发现,MySQL为每张表都创建了一个ibd文件来存储表的信息。因此,默认情况下,创建一张表,就等于创建了一个ibd文件
表空间
一个ibd文件就对应一个表空间,表空间用于存储innodb下的表信息。
使用 select @@innodb_file_per_table 来查看默认值,默认为1。
若关闭该设置,则不创建.ibd, 而是放在系统表空间下 ,即/var/lib/mysql/ibdata1
若要查看每张表的表信息,则可以到information_schema数据库下的innodb_tables表查看。
select * from information_schema.innodb_tables where name = "blog/ms_article"
共享/独立表空间
-
表空间分为共享表空间,独立表空间。
-
前者包含General、System类型(ibdata1),后者则是默认类型。
- 系统表空间还可存储Change Buffer
-
共享表空间一个文件可以存储多个表数据,独立表空间一个文件只能存储一个表数据
-
创建方法:
create TABLESPACE ts (add datafile ”name“ 可选) Engine=InnoDB
默认情况下会生成128位的uuid作为ibd文件名,也可以通过add datafile ”name“ 来指定
-
使用
create table t (c int primary key) tablespace ts