MySQL 表空间管理
1.表空间概念
InnoDB 存储引擎可将所有数据存放于 ibdata*
的共享表空间,也可将每张表存放于独立的 .ibd
文件的独立表空间.
共享表空间以及独立表空间都是针对数据的存储方式而言的。
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 独立表空间
优点:
- 每个表都有自已独立的表空间。
- 每个表的数据和索引都会存在自已的表空间中。
- 可以实现单表在不同的数据库中移动。
- 空间可以回收(除drop table操作处,表空不能自已回收)
- Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:
alter table TableName engine=innodb;
回缩不用的空间。 - 对于使innodb-plugin的Innodb使用turncate table也会使空间收缩。
- 对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。
- Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:
缺点:
- 单表增加过大,如超过100个G。
- 相比较之下,使用独占表空间的效率以及性能会更高一点。