`
hejiajunsh
  • 浏览: 409954 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Mysql Innodb共享表空间VS独立表空间

阅读更多

在使用Innodb引擎时将要面对两种表空间的管理选择的问题,Innodb有两种管理表空间的方法:

1.  共享表空间(也可以拆分成多个小的表空间)

2.  独立表空间每一个表有一个独立的表空间。

我个人推荐使用独立表空间。在性能和运维上独立表空间比共享的表空间有很多优势。下面我将分别说明一下两种表空间管理的特点。

共享表空间:

由于是默认的方式,就暂且理解为Mysql官方推荐的方式。相对而言所有的数据都在一个(或几个)文件中,比较利于管理,而且在操作的时候只需要open这一个(或几个)文件即可,相对来说代价很低。

但问题是在数据达到以G为单位来计算的时候优劣逆转。一个大小惊人的文件很不利于管理,而且对于一个如此巨大的文件来说,读写它需要耗费的资源一样巨大。更加令人费解的是,MySQL竟然将索引和数据保存于同一个文件中,索引和数据之间尚存在资源争用,不利于性能的提升。你当然可以通过innodb_data_file_path的配置规划多个表空间文件,但MySQL的逻辑是“用满后增加”,仅仅是一个文件的拆分而已,不能从根本上分离数据和索引。

优点:

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

缺点:

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

我们知道共享表空间管理会出现表空间分配后不能回缩的问题,当出现临时建索引或是创建一个临时表的操作表空间扩大后,就是删除相关的表也没办法回缩那部分空间了。我们存在磁盘监控时,也许就报警不断了,但实际上MySQL还可以运行良好。另外,当磁盘上占用较多时性能也不是太好。

这种情况处理只能是是建一个新的Slave从主库上Dump出来,然后在Dump到从库中,动作较大。

对于InnoDB Hot Backup备份的操作(或是直接冷备),每次需要CP的文件比较大。如果现在有180G的表空间,但实际数据只有50多G,那么我们将面对每次需要拷180G的数据。

这种方式也许mysqldump是一个好的处理方式了。

独立表空间:

相对而言对立表空间每个表都有独立的多个数据文件,而且做到了索引和数据的分离。多个小文件之间很方便的完成跨数据库甚至跨硬件的数据拷贝和迁移。相对来说灵活性很好。

在配置文件(my.cnf)中设置: innodb_file_per_table

优点:

1.  每个表都有自已独立的表空间。

2.  每个表的数据和索引都会存在自已的表空间中。

3.  可以实现单表在不同的数据库中移动。

4.  空间可以回收(除drop table操作处,表空不能自已回收)

a)         Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。

b)         对于使innodb-plugin的Innodb使用turncate table也会使空间收缩。

c)         对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。

缺点:

单表增加过大,如超过100个G。

对于单表增长过大的问题,如果使用共享表空间可以把文件分开,但有同样有一个问题,如果访问的范围过大同样会访问多个文件,一样会比较慢。对于独立表空间也有一个解决办法是:使用分区表,也可以把那个大的表空间移动到别的空间上然后做一个连接。其实从性能上出发,当一个表超过100个G有可能响应也是较慢了,对于独立表空间还容易发现问题早做处理。

想要将共享表空间转化为独立表空间有两种方法:
1.先逻辑备份,然后修改配置文件my.cnf中的参数innodb_file_per_table参数为1,重启服务后将逻辑备份导入即可。
2.修改配置文件my.cnf中的参数innodb_file_per_table参数为1,重启服务后将需要修改的所有innodb表都执行一遍:alter table table_name engine=innodb;
对于小表的话直接用ALTER TABLE table_name ENGINE = Innodb;回收表空间,对于大表就不能直接采用这种方式,因为会造成长时间的锁表。可以采用新建表转移数据,然后删除旧表的形式。
使用第二种方式修改后,原来库中的表中的数据会继续存放于ibdata1中,新建的表才会使用独立表空间。
mysql> show variables like '%per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)
分享到:
评论

相关推荐

    Mysql InnoDB 共享表空间和独立表空间

    mysql InnoDB的存储管理也类似,但是mysql增加了一个共享表空间和独立表空间的概念;  一、概念  共享表空间: Innodb的所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成,一个表可以...

    MySql innodb 引擎表存储分析

    - 通过查询 `innodb_file_per_table` 变量确认是否启用了独立表空间管理模式。 ```sql SHOW VARIABLES LIKE '%per%'; ``` - 结果显示 `innodb_file_per_table` 的值为 `ON`,表明启用了独立表空间管理模式。 5...

    mysql Innodb表空间卸载、迁移、装载的使用方法

    MySQL的InnoDB存储引擎在处理表空间方面有两种模式:共享表空间和独立表空间。共享表空间模式下,所有InnoDB表的数据和索引都存储在一个或多个大文件(如ibdata1)中。而独立表空间模式,也称为文件-per-table模式,...

    innodb存储引擎修改表共享空间为独立空间

    在MySQL中,InnoDB存储引擎提供了两种表空间模式:共享表空间和独立表空间。共享表空间模式下,所有的InnoDB表数据和索引都存储在一个或多个文件中,而独立表空间模式则为每个InnoDB表创建单独的数据文件。 1. **...

    浅析mysql 共享表空间与独享表空间以及他们之间的转化

    在MySQL中,默认情况下InnoDB存储引擎使用共享表空间存储方式,所有表的数据和索引都会放在同一个数据文件中,通常这个文件名为ibdata1,位于MySQL的data目录下。共享表空间的优点在于,它可以将表空间分割成多个...

    MYSQL innodb性能优化学习总结

    - **innodb_file_per_table**:该参数控制InnoDB是否为每个表使用独立的数据表空间,建议设置为1,以避免共享表空间(ibdata1)可能带来的问题,例如难以进行数据库的备份和恢复。 - **innodb_stats_on_metadata**...

    mySql 存储引擎 启用 Innodb

    - **InnoDB**:数据存储在一个或多个表空间文件中,可以是独立表空间或共享表空间。每个表空间可以包含多个表的数据。InnoDB还支持原始设备表空间,允许将表数据直接存储在裸设备上。 - **MyISAM**:每个表的数据...

    mysql-innodb

    InnoDB的数据和索引存储在表空间中,可以使用共享表空间或独享表空间。独享表空间模式下,每个表都有独立的.idb文件存储数据和索引,而.frm文件则保存元数据。表空间的移动和恢复需谨慎操作,如使用`ALTER TABLE`...

    空间不足之Lvm方案与MySQL自带方案比较

    从MySQL 5.6开始,InnoDB支持独立表空间,即每个表都有自己的表空间文件。独立表空间的特点包括: 1. **配置简单**:在配置文件中设置innodb_file_per_table选项即可。 2. **表和索引独立**:每个表的数据和索引...

    InnoDB 表的限制

    系统表空间共享所有InnoDB表,而独立表空间允许为每个表创建单独的物理文件,以更好地管理磁盘空间。 10. **内存限制** InnoDB使用缓冲池来缓存数据和索引,其大小由`innodb_buffer_pool_size`参数设置。过小会...

    MySQL 清除表空间碎片的实例详解

    - **InnoDB的表空间管理**:InnoDB支持两种表空间模式,即独立表空间(每个表一个.frm文件和一个.ibd文件)和共享表空间(所有表数据存储在一个大文件中)。可以通过`SHOW CREATE TABLE 表名`查看表的存储引擎和表...

    MySQL 5.7临时表空间如何玩才能不掉坑里详解

    MySQL 5.7版本引入了独立的临时表空间特性,为用户在使用MySQL时提供了更多的灵活性。然而,在使用过程中也可能会出现一些问题。接下来的内容将围绕MySQL 5.7的临时表空间的使用进行详细介绍,帮助用户避免使用时...

    InnoDB官方文档中文翻译版

    InnoDB使用表空间(Tablespaces)来存储数据,可以配置多个表空间,包括系统表空间(默认)和独立表空间。数据文件(.ibd)存储表的物理结构和数据,每个InnoDB表可以有自己的独立表空间文件。 六、页与B+树索引 ...

    InnoDB源码解析

    - .ibd文件:InnoDB使用独立表空间存储每个表的数据和索引。 - ibdata文件:系统表空间文件,所有表共享。 - Redo Log文件:为故障恢复提供支持,保证了事务的持久性。 - Doublewrite Buffer文件:用于存储临时页,...

Global site tag (gtag.js) - Google Analytics