当前位置: 首页 > 科技观察

MySQL中的共享表空间和独立表空间,哪个更好?

时间:2023-03-12 04:57:57 科技观察

今天开始学习MySQL中另一个非常重要的存储引擎InnoDB。说到InnoDB,就不得不说到另一个重要的话题表空间和共享表空间,这也是我们这篇文章的主题。1、独立表空间和共享表空间对于InnoDB存储引擎来说,它可以将每张表存储在一个独立的表空间中,即tablename.ibd文件;它还可以将数据存储在ibdata的共享表空间中,通用名称是ibdataX,后面的X是具体的数字。我们先来体验一下两者的区别。首先,我们执行以下代码来检查是否启用了独立表空间:showvariableslike'innodb_file_per_table';如您所见,默认情况下,独立表空间是启用的。这时候我们就使用InnoDB引擎来创建一个表,如下(默认存储引擎是InnoDB):createtablebook(idint,namevarchar(255));创建完成后,我们来到存放数据文件的目录,可以看到如下文件:可以看到,当前表存放在一个独立的book.ibd文件中。独立表空间中存储的表将以独立文件的形式存储。每张表都有一个.frm表描述文件(这个和MyISAM引擎是一致的),还有一个.ibd文件,里面包含了一个单独的表的数据内容和索引内容,默认存放在表的位置。接下来,我们执行如下代码,将innodb_file_per_table的值修改为OFF,即关闭独立表空间,如下:关闭后,新建一张表:createtablebook2(idint,namevarchar(255));新表创建成功后,我们再到表目录下查看文件,发现并没有名为book2.ibd的文件,说明此时表已经存放在共享表空间中。那么共享表空间中的ibdata1文件在哪里呢?其实就是在MySQL存放数据库的目录下:我们可以通过以下命令查看ibdata1的默认大小:showvariableslike'innodb_data_file_path';如您所见,默认大小为12M。需要注意的是innodb_file_per_table在建表前修改,建表后修改,不会影响已有的表结构。2.应该用哪一个?要弄清楚使用哪个表空间,首先要了解这两个不同表空间的特点。2.1独立表空间的优点每个表都有自己独立的表空间。每个表的数据和索引都存储在它自己的表空间中。可以在不同的数据库中移动单个表(因为每个表都有一个独立的数据表文件)。可以回收空间(通过优化表命令)。不管怎么删除,表空间的碎片都不会严重影响系统性能。缺点单表增量太大。2.2共享表空间的优点表空间可以分成多个文件存储在每个磁盘上(表空间文件的大小不受表大小的限制,比如一个表可以分布在不同的文件上)。数据和文件放在一起,便于管理。缺点所有的数据和索引都存储在一个文件中,也就是说有一个大文件(虽然一个大文件可以分成多个小文件),但是表空间中混杂着多个表和索引。这样,当一张表被大量删除后,表空间就会出现很多空隙,尤其是统计分析、日志系统等应用,最不适合使用共享表空间(例如,当系统空间不够)有时,我们希望通过删除一些无效数据来释放一些表空间。这时我们会发现,如果使用共享表空间,即使删除了无效数据,表空间仍然不会收缩)。共享表空间管理会导致表空间分配后无法收回的问题。当临时索引或临时表导致表空间膨胀时,即使删除了相关表,也没有办法收回那部分空间。对于第二个问题,一般使用mysqldump导出数据,然后删除共享表空间数据文件,再重新导入。由于多表数据保存在一个文件中,在并发操作时可能会出现IO瓶颈,所以需要频繁写入的场景不适合共享表空间。经过上面的分析,相信小伙伴们已经明白了,在实际项目中,还是选择独立表空间比较好。其实从MySQL5.6开始,独立的表空间就成为了默认选项。3.迁移结束,还有一个问题。如果一开始就创建共享表空间,是否还能迁移到独立表空间?当然!参考以下四步:使用mysqldump导出所有数据库表数据。停止MySQL服务,修改innodb_file_per_table参数,删除InnoDB相关文件(如果是主从结构,可以从Slave开始完成这些操作)。重启MySQL服务,重建InnoDB共享表空间(此时里面没有数据)。重新导入数据。那么今天就和小伙伴们聊一聊共享表空间和独立表空间。后面我们会继续介绍InnoDB的其他方式~。转载本文请联系江南一点鱼公众号。