前言:学习mysql的时候总是习惯性的和oracle数据库进行比较。在学习mysql InnoDB的存储结构的时候也免不了跟oracle进行比较。Oracle的数据存储有表空间、段、区、块、数据文件;mysql InnoDB的存储管理也类似,但是mysql增加了一个共享表空间和独立表空间的概念;
一、概念
共享表空间: Innodb的所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成,一个表可以跨多个文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。从Innodb的官方文档中可以看到,其表空间的最大限制为64TB,也就是说,Innodb的单表限制基本上也在64TB左右了,当然这个大小是包括这个表的所有索引等其他相关数据。
独立表空间:
二、查看数据库的表空间
mysql> show variables like 'innodb_data%'; |
l 表空间有四个文件组成:ibdata1、ibdata2、ibdata3、ibdata4,每个文件的大小为10M,当每个文件都满了的时候,ibdata4会自动扩展;
l 当前的存储空间满的时候,可以在其他的磁盘添加数据文件,语法如下:语法如下所示:
pathtodatafile:sizespecification;pathtodatafile:sizespec;.;pathtodatafile:sizespec[:autoextend[:max:sizespecification]]
如果用 autoextend 选项描述最后一个数据文件,当 InnoDB 用尽所有表自由空间后将会自动扩充最后一个数据文件,每次增量为 8 MB。示例:
不管是共享表空间和独立表空间,都会存在innodb_data_file文件,因为这些文件不仅仅要存放数据,而且还要充当着类似于ORACLE的UNDO表空间等一些角色。
三、共享表空间优缺点
既然Innodb有共享表空间和独立表空间两种类型,那么这两种表空间存在肯定都有时候自己的应用的场景,存在即合理。以下是摘自mysql官方的一些介绍:
3.1 共享表空间的优点
表空间可以分成多个文件存放到各个磁盘,所以表也就可以分成多个文件存放在磁盘上,表的大小不受磁盘大小的限制(很多文档描述有点问题)。
数据和文件放在一起方便管理。
3.2 共享表空间的缺点
所有的数据和索引存放到一个文件,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,当数据量非常大的时候,表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,对于经常删除操作的这类应用最不适合用共享表空间。
共享表空间分配后不能回缩:当出现临时建索引或是创建一个临时表的操作表空间扩大后,就是删除相关的表也没办法回缩那部分空间了(可以理解为oracle的表空间10G,但是才使用10M,但是操作系统显示mysql的表空间为10G),进行数据库的冷备很慢;
四、独立表空间的优缺点
4.1 独立表空间的优点
每个表都有自已独立的表空间,每个表的数据和索引都会存在自已的表空间中,可以实现单表在不同的数据库中移动。
空间可以回收(除drop table操作处,表空不能自已回收)
Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。
对于使innodb-plugin的Innodb使用turncate table也会使空间收缩。
对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。
4.2 独立表空间的缺点
单表增加过大,当单表占用空间过大时,存储空间不足,只能从操作系统层面思考解决方法;
五、共享表空间和独立表空间之间的转换
5.1 查看当前数据库的表空间管理类型
脚本:show variables like "innodb_file_per_table";
mysql> show variables like "innodb_file_per_table"; |
ON代表独立表空间管理,OFF代表共享表空间管理;(查看单表的表空间管理方式,需要查看每个表是否有单独的数据文件)
5.2 修改数据库的表空间管理方式
修改innodb_file_per_table的参数值即可,但是修改不能影响之前已经使用过的共享表空间和独立表空间;
innodb_file_per_table=1 为使用独占表空间
innodb_file_per_table=0 为使用共享表空间
5.3共享表空间转化为独立表空间的方法(参数innodb_file_per_table=1需要设置)
单个表的转换操作,脚本:alter table table_name engine=innodb;
当有大量的表需要操作的时候,先把数据库导出,然后删除数据再进行导入操作,该操作可以用mysqldump进行操作(http://blog.itpub.net/12679300/viewspace-1259451/)
总结:经过以上操作便完成数据库的存储空间的转换,了解技术是为了更好的利用技术,当数据量很小的时候建议使用共享表空间的管理方式。数据量很大的时候建议使用独立表空间的管理方式。
相关推荐
- **表空间类型**:InnoDB支持多种类型的表空间,包括共享表空间、独立表空间和临时表空间等。 - **表空间管理**:包括创建、删除、扩展和收缩表空间的操作。 - **InnoDB配置参数**:涉及表空间管理的一些关键配置...
而其他一些元数据,如撤销 (undo) 信息和系统事务信息,则仍然存储在共享表空间内。 - 数据段 (Data Segment) 和索引段 (Index Segment) 分别对应B+树的叶节点和非叶节点。 - 表空间由一系列页和段组成,其中每个...
InnoDB有两种类型的表空间:共享表空间和独立表空间。 ###### 共享表空间(Shared Tablespace) - **定义**:在共享表空间模式下,一个数据库的所有表数据和索引文件都被存储在同一个文件中。该文件通常位于MySQL的...
MySQL的InnoDB存储引擎在处理表空间方面有两种模式:共享表空间和独立表空间。共享表空间模式下,所有InnoDB表的数据和索引都存储在一个或多个大文件(如ibdata1)中。而独立表空间模式,也称为文件-per-table模式,...
在MySQL中,InnoDB存储引擎提供了两种表空间模式:共享表空间和独立表空间。共享表空间模式下,所有的InnoDB表数据和索引都存储在一个或多个文件中,而独立表空间模式则为每个InnoDB表创建单独的数据文件。 1. **...
MySQL数据库存储结构中的表空间是指存储表和索引数据的地方,它有共享表空间和独享表空间两种基本形式,它们各有优缺点,并且支持相互之间的转换。 共享表空间通常指的是多个表的数据和索引存储在同一个文件或一组...
- **innodb_file_per_table**:该参数控制InnoDB是否为每个表使用独立的数据表空间,建议设置为1,以避免共享表空间(ibdata1)可能带来的问题,例如难以进行数据库的备份和恢复。 - **innodb_stats_on_metadata**...
- **InnoDB**:数据存储在一个或多个表空间文件中,可以是独立表空间或共享表空间。每个表空间可以包含多个表的数据。InnoDB还支持原始设备表空间,允许将表数据直接存储在裸设备上。 - **MyISAM**:每个表的数据...
InnoDB有多个可调整的启动选项和系统变量,例如`innodb_additional_mem_pool_size`用于设置数据字典和其他内部数据结构的内存大小,`innodb_autoextend_increment`定义自动增长的共享表空间扩展大小,`innodb_...
MySQL的InnoDB存储引擎支持共享表空间,也就是ibdata文件,其中可以存储多个表的数据和索引。共享表空间的几个特点如下: 1. **文件系统限制较少**:共享表空间可以跨越多个文件存储,当单个文件增大到一定程度时,...
InnoDB表的数据存储在表空间中,包括系统表空间和独立表空间。系统表空间共享所有InnoDB表,而独立表空间允许为每个表创建单独的物理文件,以更好地管理磁盘空间。 10. **内存限制** InnoDB使用缓冲池来缓存数据...
- **InnoDB的表空间管理**:InnoDB支持两种表空间模式,即独立表空间(每个表一个.frm文件和一个.ibd文件)和共享表空间(所有表数据存储在一个大文件中)。可以通过`SHOW CREATE TABLE 表名`查看表的存储引擎和表...
在实际操作中,需要对产生的临时表数据和表结构进行管理和优化,以确保性能。 总之,MySQL 5.7的独立临时表空间特性为用户带来了更多的便利,但在使用时需要注意一些可能的问题和限制。通过合理配置和监控,以及...
InnoDB使用表空间(Tablespaces)来存储数据,可以配置多个表空间,包括系统表空间(默认)和独立表空间。数据文件(.ibd)存储表的物理结构和数据,每个InnoDB表可以有自己的独立表空间文件。 六、页与B+树索引 ...
- .ibd文件:InnoDB使用独立表空间存储每个表的数据和索引。 - ibdata文件:系统表空间文件,所有表共享。 - Redo Log文件:为故障恢复提供支持,保证了事务的持久性。 - Doublewrite Buffer文件:用于存储临时页,...