MySQL中怎么判断InnoDB表是独立表空间还是共享表空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、独立表空间优缺点

1. 优点:

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

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

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

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

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

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

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

2. 缺点

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

二、判别数据表是独立表空间还是共享表空间

1. 通过ibd文件判别

如果表的存储引擎是InnoDB,而且表空间(tablespace)是共享表空间的话,那么数据库对应目录下面是没有"表名.ibd"文件的。独立表空间的表的话,则有"表名.ibd"文件。只是这个方法很笨,对于生产环境,大量的表通过这种方式判别,确实不是一个好方法。

--innodb_file_per_table=1showvariableslike'innodb_file_per_table';createtableIndependent_tablespace(namevarchar(64));ls-lrtindependent_tablespace.*--innodb_file_per_table=0showvariableslike'innodb_file_per_table';createtablecommon_tablespace(namevarchar(64));ls-lrtindependent_tablespace.*

2. INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES判别

MySQL 5.6的INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES 关于这个系统表提供了有关表格的格式和存储特性,包括行格式,压缩页面大小位级别的信息(如适用),INNODB的表空间信息。

--共享表空间SELECTTABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,N'共享表空间'ASTABLE_SPACE,ENGINE,VERSION,TABLE_ROWS,AVG_ROW_LENGTH,CREATE_TIME,UPDATE_TIMEFROMINFORMATION_SCHEMA.TABLESTLEFTJOININFORMATION_SCHEMA.INNODB_SYS_TABLESPACESIONCONCAT(T.TABLE_SCHEMA,'/',T.TABLE_NAME)=I.NAMEWHEREI.NAMEISNULLANDT.TABLE_SCHEMA='HWB'ANDT.ENGINE='InnoDB';--独立表空间SELECTTABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,N'独立表空间'ASTABLE_SPACE,ENGINE,VERSION,TABLE_ROWS,AVG_ROW_LENGTH,CREATE_TIME,UPDATE_TIMEFROMINFORMATION_SCHEMA.TABLESTINNERJOININFORMATION_SCHEMA.INNODB_SYS_TABLESPACESIONCONCAT(T.TABLE_SCHEMA,'/',T.TABLE_NAME)=I.NAMEWHERET.TABLE_SCHEMA='HWB'ANDT.ENGINE='InnoDB';

3. INFORMATION_SCHEMA.INNODB_SYS_TABLES判别(推荐)

MySQL 5.7 的INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES中多了SPACE_TYPE字段,不过其值全部为Single,而INFORMATION_SCHEMA.INNODB_SYS_TABLES中也多了字段SPACE_TYPE, 其值有Single与System 分别表示独立表空间和共享表空间。

--独立表空间SELECT*FROMINFORMATION_SCHEMA.INNODB_SYS_TABLESWHERESPACE_TYPE='Single';SELECTTABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,N'独立表空间'ASTABLE_SPACE,ENGINE,VERSION,TABLE_ROWS,AVG_ROW_LENGTH,CREATE_TIME,UPDATE_TIMEFROMINFORMATION_SCHEMA.TABLESTINNERJOININFORMATION_SCHEMA.INNODB_SYS_TABLESPACESIONCONCAT(T.TABLE_SCHEMA,'/',T.TABLE_NAME)=I.NAMEWHERET.TABLE_SCHEMA='HWB'ANDT.ENGINE='InnoDB';--共享表空间SELECTTABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,N'共享表空间'ASTABLE_SPACE,ENGINE,VERSION,TABLE_ROWS,AVG_ROW_LENGTH,CREATE_TIME,UPDATE_TIMEFROMINFORMATION_SCHEMA.TABLESTLEFTJOININFORMATION_SCHEMA.INNODB_SYS_TABLESPACESIONCONCAT(T.TABLE_SCHEMA,'/',T.TABLE_NAME)=I.NAMEWHEREI.NAMEISNULLANDT.TABLE_SCHEMA='HWB'ANDT.ENGINE='InnoDB';

看完上述内容,你们掌握MySQL中怎么判断InnoDB表是独立表空间还是共享表空间的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!