一文看懂MySQL如何判断InnoDB表是独立表空间还是共享表空间

数据库 MySQL
InnoDB采用按表空间(tablespace)的方式进行存储数据,那么独立表空间有哪些优劣呢?怎么去判断XX表是独立表空间还是共享表空间?

InnoDB采用按表空间(tablespace)的方式进行存储数据,默认配置情况下会有一个初始大小为10MB, 名字为ibdata1的文件, 该文件就是默认的表空间文件(tablespce file),用户可以通过参数innodb_data_file_path对其进行设置,可以有多个数据文件,如果没有设置innodb_file_per_table的话, 那些Innodb存储类型的表的数据都放在这个共享表空间中,而系统变量innodb_file_per_table=1的话,那么InnoDB存储引擎类型的表就会产生一个独立表空间。

那么独立表空间有哪些优劣呢?怎么去判断XX表是独立表空间还是共享表空间?

一、独立表空间优缺点

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=1 
show variables like 'innodb_file_per_table'; 
create table Independent_tablespace(name  varchar(64)); 
ls -lrt independent_tablespace.* 
--innodb_file_per_table=0 
show variables like 'innodb_file_per_table'; 
create table common_tablespace(name varchar(64)); 
ls -lrt independent_tablespace.* 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

一文看懂MySQL如何判断InnoDB表是独立表空间还是共享表空间

一文看懂MySQL如何判断InnoDB表是独立表空间还是共享表空间

2. INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES判别

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

--共享表空间 
SELECT TABLE_SCHEMA 
    ,TABLE_NAME 
    ,TABLE_TYPE 
    ,N'共享表空间' AS TABLE_SPACE 
    ,ENGINE 
    ,VERSION 
    ,TABLE_ROWS 
    ,AVG_ROW_LENGTH 
    ,CREATE_TIME 
    ,UPDATE_TIME 
FROM INFORMATION_SCHEMA.TABLES  T 
LEFT JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON  CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME 
WHERE I.NAME IS NULL  AND T.TABLE_SCHEMA='HWB' AND T.ENGINE='InnoDB'
--独立表空间 
SELECT TABLE_SCHEMA 
    ,TABLE_NAME 
    ,TABLE_TYPE 
    ,N'独立表空间' AS TABLE_SPACE 
    ,ENGINE 
    ,VERSION 
    ,TABLE_ROWS 
    ,AVG_ROW_LENGTH 
    ,CREATE_TIME 
    ,UPDATE_TIME 
FROM INFORMATION_SCHEMA.TABLES  T 
INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON  CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME 
WHERE T.TABLE_SCHEMA='HWB'  AND T.ENGINE='InnoDB'
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.

一文看懂MySQL如何判断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 * FROM  INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE SPACE_TYPE='Single'
SELECT TABLE_SCHEMA 
    ,TABLE_NAME 
    ,TABLE_TYPE 
    ,N'独立表空间' AS TABLE_SPACE 
    ,ENGINE 
    ,VERSION 
    ,TABLE_ROWS 
    ,AVG_ROW_LENGTH 
    ,CREATE_TIME 
    ,UPDATE_TIME 
FROM INFORMATION_SCHEMA.TABLES  T 
INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON  CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME 
WHERE T.TABLE_SCHEMA='HWB'  AND T.ENGINE='InnoDB'
 
--共享表空间 
SELECT TABLE_SCHEMA 
    ,TABLE_NAME 
    ,TABLE_TYPE 
    ,N'共享表空间' AS TABLE_SPACE 
    ,ENGINE 
    ,VERSION 
    ,TABLE_ROWS 
    ,AVG_ROW_LENGTH 
    ,CREATE_TIME 
    ,UPDATE_TIME 
FROM INFORMATION_SCHEMA.TABLES  T 
LEFT JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON  CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME 
WHERE I.NAME IS NULL  AND T.TABLE_SCHEMA='HWB' AND T.ENGINE='InnoDB'
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.

一文看懂MySQL如何判断InnoDB表是独立表空间还是共享表空间

责任编辑:赵宁宁 来源: 今日头条
相关推荐

2021-07-14 10:38:29

MySQL共享表独立表

2010-11-23 13:57:50

MySQL独立表空间

2021-07-02 09:45:29

MySQL InnoDB数据

2021-10-17 19:48:10

扩展页表虚拟机

2019-09-17 08:23:35

MySQL数据库容量

2009-01-18 11:11:36

InnoDBMySQLMVCC

2021-09-08 19:35:02

MySQL Keyring加密

2021-01-06 05:31:13

线性表链表数据

2021-01-08 08:10:34

MySQL表空间回收

2021-09-10 16:10:21

panda透视表语言

2020-09-27 08:00:49

分库分表

2022-10-19 21:24:24

临时表空间Oracle

2011-08-23 10:54:16

PostgreSQL表空间用户

2009-11-02 18:03:25

Oracle用户表空间

2010-11-01 12:11:43

DB2表空间

2010-11-15 11:40:44

Oracle表空间

2016-12-27 15:47:19

临时表空间数据

2010-11-16 11:32:54

ORACLE增加表空间

2009-10-26 16:13:29

Oracle使用UND

2009-10-29 16:57:05

Oracle传输表空间
点赞
收藏

51CTO技术栈公众号