下面的测试是基于MySQL 8.0。
1. InnoDB 存储引擎
InnoDB 存储引擎分两种情况:
1) 共享表空间
如果是共享表空间的话,所有基于InnoDB存储引擎的表数据都会记录在该共享表空间中,比如ibdata1,ibdata2,ibdata3 ...,ibdataN 等这些文件中。具体的可以进行配置:
这是Innodb 默认的表空间配置,也可以对innodb_data_file_path进行配置,比如设置:innodb_data_file_path = ibdata1:200M;ibdata2:500M:autoextend,需要注意的是这里只有ibdata2 会自动增长,如果500M空间用完了的话。
2) 独立表空间
若设置参数innodb_file_per_table=on,则用户可以将每个基于InnoDB存储引擎的表产生一个独立表空间。独立表空间的命名规则为:表名.ibd,通过这样的方式用户不用将所有的数据都存放于默认的表空间中。
Innodb独立表空间配置.png
我这边是打开的,那么下面我们进入数据目录看下存储文件。
ibd文件.png
发现每张表都生成了一个以表的名称命名的.ibd 文件,不过需要注意的是,这些单独的表空间文件仅存放该表的数据、索引和插入缓冲BITMAP等信息,其余信息还是存放在默认的表空间中。
思考:
-
小伙伴可能会想共享表空间有没有大小限制还有独立表空间呢?
共享表空间由于可以指定多个存储文件,并且可以存储在不同的磁盘上,所以从某种程度来讲,共享表空间不受文件大小的限制,而是其自身的限制。看下官方文档上的描述:
Innodb表空间大小限制.png
这句话的意思大概是独立表空间的大小限制是64TB,相比之下,独立表空间每张表的大小限制也是64TB。
- 这两种形式的存储方式各有哪些优缺点呢?
a. 共享表空间
优点:
(1)由于文件可以指定多个目录,所以其大小不受文件大小限制的。
(2)表数据和表描述放在一起方便管理
缺点:
所有的数据和索引存放到一个文件中,将有一个很大的文件,虽然可以把一个大的文件分成多个小的文件,但是多个表及索引在表空间中混合存储,这样对于做了大量删除操作后表空间将会有大量的空隙。
b. 独立表空间
优点:
(1) 每个表都有自己独立的表空间
(2) 每个表的数据索引都会存在自己的表空间中。
(3) 可以实现单表在不同的数据库中移动。
(4)空间可以回收
对于独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还要机会处理。
(5)使用独立表空间的效率以及性能会高一点。
缺点:
单表增加过大,如超过100G:
当使用独立表空间来存放Innodb的表的时候,每个表的数据以一个单独的文件来存放,这个时候的单表限制又变成了系统的大小限制了。需要注意的是不同的操作系统(其实是文件系统)对文件大小的限制是不同的。
2. 1. MyISAM 存储引擎
为了测试,笔者在这里先创建一张myisam表user2,下面进入数据目录查看下:
myisam存储文件.png
我们可以看到在创建了一张myisam表后mysql帮我们创建了3个文件:user2_345.sdi,user2.MYD,user2.MYI。
MYD: 是数据文件。
MYI:是索引文件。
sdi:这个文件小伙伴们可能比较陌生,SDI是Serialized Dictionary Information 的缩写,是MySQL8.0重新设计数据词典后引入的产物,我们知道MySQL8.0开始已经统一使用Innodb存储引擎来存储数据表的元数据(比如描述数据库事务支持情况等),但对于非Innodb存储引擎,MySQL提供了另外一种可读的文件格式来描述表的元数据信息。
思考:MyISAM存储文件大小限制?
MyISAM 存储引擎的数据表它不能指定存储的文件,所有创建的表将会在指定的数据目录下,所以它势必会受到磁盘空间大小的限制,另外,MySQL数据库的MyISAM存储 引擎单表大小限制已经不是有MySQL数据库本身来决定(限制扩大到64pb),而是由所在主机的OS上面的文件系统来决定了。
今天的文章就写到这里吧,有需要补充的小伙伴欢迎在下面给我留言,看到会及时回复。
网友评论