InnoDB
InnoDB
是使用页
为基本单位来管理存储空间的,默认的页
大小为16KB
。- 对于
InnoDB
存储引擎来说,每个索引都对应着一棵B+
树,该B+
树的每个节点都是一个数据页,数据页之间不必要是物理连续的,因为数据页之间有双向链表
来维护着这些页的顺序。 InnoDB
的聚簇索引的叶子节点存储了完整的用户记录,也就是所谓的索引即数据,数据即索引。
为了更好的管理这些页,InnoDB
提出了一个表空间
或者文件空间
(英文名:table space
或者file space
)的概念,这个表空间是一个抽象的概念,它可以对应文件系统上一个或多个真实文件(不同表空间对应的文件数量可能不同)。每一个表空间
可以被划分为很多很多很多个页
,我们的表数据就存放在某个表空间
下的某些页里。
系统表空间
可以对应文件系统上一个或多个实际的文件,默认情况下,InnoDB
会在数据目录
下创建一个名为ibdata1
、大小为12M
的文件,这个文件就是对应的系统表空间
在文件系统上的表示。
需要注意的一点是,在一个MySQL服务器中,系统表空间只有一份。从MySQL5.5.7到MySQL5.6.6之间的各个版本中,我们表中的数据都会被默认存储到这个 系统表空间
。
在MySQL5.6.6以及之后的版本中,InnoDB
并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间
来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间
的文件,文件名和表名相同,只不过添加了一个.ibd
的扩展名而已。
MyISAM
在MyISAM
中的索引全部都是二级索引
,该存储引擎的数据和索引是分开存放的。所以在文件系统中也是使用不同的文件来存储数据文件和索引文件。而且和InnoDB
不同的是,MyISAM
并没有什么所谓的表空间
一说,表数据都存放到对应的数据库子目录下。假如test
表使用MyISAM
存储引擎的话,那么在它所在数据库对应的xiaohaizi
目录下会为test
表创建这三个文件:
test.frm
test.MYD
test.MYI
其中test.MYD
代表表的数据文件,也就是我们插入的用户记录;test.MYI
代表表的索引文件,我们为该表创建的索引都会放到这个文件中。
Innodb和MyISAM的区别
MyISAM
不支持事务
,但是每次查询都是原子的;
不支持行级锁,支持表级锁
,即每次操作是对整个表加锁;
存储表的总行数
,COUNT(*)效率高;
一个MYISAM 表有三个文件:索引文件、表结构文件、数据文件;
采用非聚集索引
,索引文件的数据域存储指向数据文件的指针。
InnoDb
支持ACID 的事务, 支持事务的四种隔离级别; 支持行级锁及外键约束:因此可以支持写并发;
不存储总行数:
一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里,也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为2G,受操作系统文件大小的限制;
主键索引采用聚集索引
(索引的数据域存储数据本身),二级索引的数据域存储主键的值;因此从二级索引查找数据,需要先通过二级索引找到主键值,再访问聚集索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。