Mysql Innodb的两种表空间方式
2013-05-08 16:37
302 查看
要说表空间,Mysql的表空间管理远远说不上完善。换句话说,事实上Mysql根本没有真正意义上的表空间管理。Mysql的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间。只要在my.cnf里面增加innodb_file_per_table=1就可以从共享表空间切换到独立表空间。当然对于已经存在的表,则需要执行alter table MY_TABLE engine=innodb命令迁移数据。
共享表空间方式由于是默认的方式,就暂且理解为Mysql官方推荐的方式。相对而言所有的数据都在一个(或几个)文件中,比较利于管理,而且在操作的时候只需要open这一个(或几个)文件即可,相对来说代价很低。
但问题是在数据达到以G为单位来计算的时候优劣逆转。一个大小惊人的文件很不利于管理,而且对于一个如此巨大的文件来说,读写它需要耗费的资源一样巨大。更加令人费解的是,MySQL竟然将索引和数据保存于同一个文件中,索引和数据之间尚存在资源争用,不利于性能的提升。你当然可以通过innodb_data_file_path的配置规划多个表空间文件,但MySQL的逻辑是“用满后增加”,仅仅是一个文件的拆分而已,不能从根本上分离数据和索引。
之前曾经遭遇到700G以上的表空间文件,而且更加让人郁闷的是对于如此大的文件还在以每天数G的数量增加。由于无法停机,即便是拷贝一下也要花费差不多一夜,只能眼睁睁看着它继续增大而毫无保守可行的办法。
独立表空间方式
相对而言对立表空间每个表都有独立的多个数据文件,而且做到了索引和数据的分离。多个小文件之间很方便的完成跨数据库甚至跨硬件的数据拷贝和迁移。相对来说灵活性很好。
这样做同样带来另一个方面的问题。当数据库中的表数量达到一定级别时,每次操作所涉及的文件过多,如果按照默认Centos的ulimit -n = 1024的话,仅仅只能保证同时打开256个表以内,这在习惯上“拆库拆表”的MySQL数据结构上很难达到要求。尚且这种数据文件的利用率不算很高,当大量“不高”的文件集中起来,浪费的空间也很惊人,更何况最后可能出现的状况不是“一堆K级别的小文件”而是“一堆G级别的大文件”,有点适得其反的意思。你自然可以联想到分区表,又是一个“仅仅做文件拆分而已”,多个分区文件缺一不可。
之前同样遇到过这个问题,MySQL连接大的状况下大量的timeout,但主机负载还算可以,查了一圈才知道是open files限制的问题,限制一修改,负载变得惊人,但连接数却又提升的不多。
总之,两种方法各有所长,部分互补,但都不是解决问题的终极方案。期待MySQL能够出现真正意义上表空间的概念,更加自由的规划数据文件。
相关文章推荐
- Mysql Innodb的两种表空间方式 共享空间和独立空间
- Mysql Innodb的两种表空间方式
- 关于删除mysql大表数据并释放存储空间的两种方式
- MySQL InnoDB 备份与恢复七种方式
- MySQL两种表存储结构MyISAM和InnoDB的性能比较测试
- mysql5.6设置数据库read_only的两种方式
- MySQL JDBC PrepareStatement基本的两种模式&客户端空间占用的源码分析
- mysql Innodb表空间卸载、迁移、装载的使用方法
- Mysql两种安装方式比较
- 使用参数innodb_file_per_table支持MySQL InnoDB表数据共享空间自动收缩
- mysql存储方式MyISAM和InnoDB的区别
- php和mysql两种不同方式的分割字符串和类型转换
- MySQL两种表存储结构MyISAM和InnoDB的性能比较测试
- mysql查询成绩排名显示-两种排名方式
- MySQL两种主要表存储结构MyISAM和InnoDB比较
- mysql innodb 独占表空间和共享表空间
- MySQL InnoDB 共享表空间和独立表空间
- 如何增加虚拟机VM的空间(两种方法:增加磁盘方式和增加分区方式)
- Mysql存储emoji表情的两种方式
- MySQL InnoDB 共享表空间和独立表空间