1.表空间概念

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

MySQL_Table_Space.jpg

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

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

  • 共享表空间

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

  • 独立表空间

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

 

2.共享表空间

2.1 查看共享表空间

  • 物理文件查看

    $ cd /usr/local/mysql/data
    $ 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 设置共享表空间

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

  • 编辑配置文件

    $ vim /etc/my.cnf
    [mysqld]
    innodb_data_file_path=ibdata1:12M;ibdata2:50M:autoextend

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

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

 

3.独立表空间

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

3.1 查看独立表空间

  • 物理查看

    $ cd /usr/local/mysql/data/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.两种表空间的优缺点

4.1 共享表空间

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

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

4.2 独立表空间

优点:

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

缺点:

  1. 单表增加过大,如超过100个G。
  2. 相比较之下,使用独占表空间的效率以及性能会更高一点。