InnoDB采用按表空间(表空间)的方式进行存储数据,默认配置情况下会有一个初始大小为10 mb,名字为ibdata1的文件,该文件就是默认的表空间文件(tablespce文件),用户可以通过参数innodb_data_file_path对其进行设置,可以有多个数据文件,如果没有设置innodb_file_per_table的话,那些InnoDB存储类型的表的数据都放在这个共享表空间中,而系统变量innodb_file_per_table=1的话,那么InnoDB存储引擎类型的表就会产生一个独立表空间,独立表空间的命名规则为:表名.idb。这些单独的表空间文件仅存储该表的数据,索引和插入缓冲位图等信息,其它信息还是存放在共享表空间中,那么如何判别数据库中哪些表是独立表空间,哪些表是共享表空间呢?
<强> InnoDB逻辑存储结构强>
如果表的存储引擎是InnoDB,而且表空间(表空间)是共享表空间的话,那么数据库对应目录下面是没有“表名.ibd”文件的。独立表空间的表的话,则有“表名.ibd”文件。只是这个方法很笨,对于生产环境,大量的表通过这种方式判别,确实不是一个好方法。
mysql>显示变量如“innodb_file_per_table”; + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | | Variable_name |值 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | innodb_file_per_table |> mysql>显示变量如“innodb_file_per_table”; + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | | Variable_name |值 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | innodb_file_per_table | | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 1行集(0.00秒) mysql>使用MyDB; 完成阅读表信息表和列的名称 你可以关掉这个功能——更快的启动 数据库修改 mysql>创建表common_tablespace(名字varchar (64)); 查询好,0行影响(0.02秒) mysql>退出 再见 [root@DB-Server MyDB] # ls轻轨车common_tablespace * -rw-rw mysql mysql——8560 8月21日22:08 common_tablespace.frm [root@DB-Server MyDB] #
<强> MySQL 5.6 强>
5.6 INFORMATION_SCHEMA MySQL。INNODB_SYS_TABLESPACES关于这个系统表提供了有关表格的格式和存储特性,包括行格式,压缩页面大小位级别的信息(如适用),INNODB的表空间信息。
INNODB_SYS_TABLESPACES表提供了关于InnoDB表空间元数据,相当于在InnoDB SYS_TABLESPACES表中的信息数据字典。
引用>花了点时间了解了一下INFORMATION_SCHEMA数据库下面的INNODB_SYS_TABLESPACES这个表,遂写了一个SQL来判断那些InnoDB引擎表是独立表空还是共享表空间
共享表空间:
选择TABLE_SCHEMA ,TABLE_NAME ,TABLE_TYPE N”共享表空间的TABLE_SPACE 、发动机 ,版本 ,TABLE_ROWS ,AVG_ROW_LENGTH ,CREATE_TIME ,UPDATE_TIME 从INFORMATION_SCHEMA。表T 加入INFORMATION_SCHEMA离开了。INNODB_SYS_TABLESPACES我alt=" MySQL判别InnoDB表是独立表空间还是共享表空间的方法详解">不过这个脚本有个小小的错误,对于包含特殊字符的表名,有可能出现错误情况,这个是因为如果表名包含特殊字符,那么文件名或INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES中的名字做了转义处理,如下所示
![]()
独立表空间
选择TABLE_SCHEMA ,TABLE_NAME ,TABLE_TYPE N的独立表空间的TABLE_SPACE 、发动机 ,版本 ,TABLE_ROWS ,AVG_ROW_LENGTH ,CREATE_TIME ,UPDATE_TIME 从INFORMATION_SCHEMA。表T 内连接INFORMATION_SCHEMA。INNODB_SYS_TABLESPACES我alt=" MySQL判别InnoDB表是独立表空间还是共享表空间的方法详解">
<强> MySQL 5.7 强>
如果是MySQL 5.7的话,比MySQL 5.6有多了一种方法,MySQL 5.7的INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES中多了SPACE_TYPE字段,不过其值全部为单身,而INFORMATION_SCHEMA。INNODB_SYS_TABLES中也多了字段SPACE_TYPE,其值有单与系统分别表示单独表空间和共享表空间。
MySQL判别InnoDB表是独立表空间还是共享表空间的方法详解