MySQL 表空间管理

1.表空间概念

InnoDB存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间.
共享表空间以及独立表空间都是针对数据的存储方式而言的。

MySQL_Table_Space.jpg

MySQL从5.5版本以后出现共享表空间概念,在MySQL5.6版本中默认使用的是独立表空间

表空间的管理模式的出现是为了数据库的存储更容易扩展。

  • 共享表空间

某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下。 默认的文件名为:ibdata1 初始化为10M。

  • 独立表空间

每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件。 其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中。

2.共享表空间

2.1 查看共享表空间

  • 物理文件查看
[root@db01 ~]# cd /usr/local/mysql/data
[root@db01 ~]# ll ibdata*
-rw-rw---- 1 mysql mysql 79691776 Jun 17 16:26 ibdata1
  • 在数据库命令行中查看
mysql> SHOW VARIABLES LIKE "%file_path%";
+-----------------------+------------------------+
| Variable_name         | Value                  |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+-----------------------+------------------------+

2.2 共享表中存储的内容

InnoDB共享表空间文件ibdata1中存储了以下几部分信息:

  • Data dictionary
  • Double write buffer
  • Insert buffer
  • Rollback segments
  • UNDO space
  • Foreign key constraint system tables

因此,我们在初始化ibdata1时,最好设置大一些,这样就可以避免因为在高并发情景下导致ibdata1急剧增大,大大影响性能。

2.3 设置共享表空间

5.7版本中默认会将undo和临时表独立出来,5.6版本也可以独立,只不过需要在初始化的时候进行配置

  • 编辑配置文件
[root@db01 data]# vim /etc/my.cnf
[mysqld]
innodb_data_file_path=ibdata1:12M;ibdata2:50M:autoextend

修改完启动可能会报错,一般是由于ibdata1的大小设置与当前表空间大小不一致造成的。

解决办法:把ibdata1的大小设置成与当前表空间一致,就可以正常启动。

3.独立表空间

对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理。

3.1 查看独立表空间

  • 物理查看
[root@db01 ~]# cd /usr/local/mysql/data/world
[root@db01 world]# ll city.*
-rw-rw---- 1 mysql mysql   8710 Jun 15 21:37 city.frm
-rw-rw---- 1 mysql mysql 835584 Jun 15 21:41 city.ibd
  • 命令行查看
mysql> SHOW VARIABLES LIKE "%per_table%";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+

3.2 设置独立空间表

  • 临时设置(命令行设置)
mysql> SET GLOBAL innodb_file_per_table=ON;
  • 永久设置(修改配置文件)
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
innodb_file_per_table=ON

4.两种表空间的优缺点

  • 共享表空间

优点:可以将表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同的文件上)。数据和文件放在一起方便管理。

缺点:所有的数据和索引存放到一个文件中,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间。

  • 独立表空间

优点:
1.每个表都有自已独立的表空间。
2.每个表的数据和索引都会存在自已的表空间中。
3.可以实现单表在不同的数据库中移动。
4.空间可以回收(除drop table操作处,表空不能自已回收)
a.Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。
b.对于使innodb-plugin的Innodb使用turncate table也会使空间收缩。
c.对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。
缺点:
1.单表增加过大,如超过100个G。
2.相比较之下,使用独占表空间的效率以及性能会更高一点。

点赞

发表回复