InnoDB 表空间

数据字典

Mysql 服务器集成了一个事务数据字典,他存储关于数据库对象的信息。在之前的MySQL版本中,字典数据存储在元数据文件、非事务性表和存储引擎特定的数据字典中。 在MySQL8之前的文件中有, MySQL8之后都已经删除下面仅供参考frm 文件定义表元数据 par 分区定义文件 trn 触发器命名空间文件 trg 出去参数文件 isl InnoDB符号链接文件,包含在MySQL 数据目录之外创建的每个表空间文件的位置

优点

  • 集中管理数据字典模式统一存储字典数据、更简单。
  • 对字典数据的事务性、崩溃时的安全性。
  • 对字典对象的统一和集中缓存.
  • 对一些INFORMATION_SCHEMA表的实现进行简化和改进。
  • 原子化DLL

缺点

  • 手动创建的数据库目录不被MySQL服务器识别
  • 不支持复制和移动MyISAM数据文件
  • 由于要写入存储引擎、UNDO日志和REDO日志,而不是写入frm文件,因此DLL操作需要更长时间。


共享表空间(单个文件)

共享表空间方式,整个数据库的表数据和索引存储在一个文件中,共享表空间的文件路径在data目录下。 默认的文件名为:ibdata1 初始化为12M

优点

  • 表空间可以自动分成多个文件存放到各个磁盘上,一个表的数据可以分布在不同的文件上。表数据的大小限制不再是文件系统单个文件大小的限制,而是InnoDB自身的限制。从Innodb官方文档可知,其表空间的最大限制为64TB,也就是说,Innodb的单表大小限制也在64TB左右


缺点

  • 所有的数据和索引存放到一个文件中,会是一个很常大的文件,虽然可以把一个大文件分成多个小文件,但是整个数据库的表及索引在表空间中混合存储,这样对于数据库做了大量删除操作后表空间中将会有大量的空隙。

调整表空间大小

  1. -- 查看配置大小
  2. innodb_data_file_path=ibdata:50M;ibdata2:50M:autoextend

如果调整表空间需要先修改配置文件,然后重新初始化MySQL才能,重新指定工作路径。

独立表空间 (多个文件)

独立表空间方式,在mysqldata/database下,每一个表都有一个.frm表描述文件,还有一个.ibd,每个表的数据和索引单独存放在以表命名的ibd文件中;

image.png

优点

  • 每个表都有自已独立的表空间物理文件,数据存储清晰,灾难恢复相对容易,不会影响其他表。
  • 可以实现单表在不同的数据库中移动。
  • 空间更容易回收。
  • 对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理,处理方式如下:Drop table操作时自动回收表空间;对于innodb-plugin的Innodb使用turncate table收缩表空间


缺点

  • 使用独享表空间来存放Innodb的表,每个表的数据以一个单独的文件来存放,这个时候的单表数据量的限制,又变成文件系统的大小限制了,不过像linux新的文件系统ext4 xfs 文件系统来说是无限制的,文件大小也够用了。

通用表空间

通用表空间是MySQL8新特性,通过 CREATE TABLESPACE 创建的共享 InnoDB 表空间。通用表空间可以在MySQL 数据目录之外创建,可以容纳多张表,并支持多有行格式的表。

  • 一个通用的表空间是一个共享的InnoDB表空间。
  • 与系统表空间类似,一般的表空间是共享的表空间,可以存储多个表的数据
  • 一般的表空间比文件表的表空间具有潜在的内存优势。
  • MySQL 将表空间元数据保存到一个表空间的生命周期中。在更少的一般表空间中,多个表对表空间元数据的内存比在单独的文件表空间表空间中的相同数量的表要少。
  • 一般的表空间数据文件可能放在一个相对于MySQL数据目录的目录中,它为您提供了许多文件表空间的数据文件和存储管理功能。与文件表的表空间一样,在MySQL数据目录之外放置数据文件的能力允许您单独管理关键表的性能,为特定的表设置RAID或DRBD,或者将表绑定到特定的磁盘。

创建表空间

-- 默认FILE_BLOCK_SIZE=16384 16K
CREATE TABLESPACE [空间名] ADD datafile '/data/mysql_data/test.ibd' FILE_BLOCK_SIZE=16384  ENGINE=InnoDB;

image.png

删除表空间

DROP TABLESPACE [空间名]

InnoDB REDO 日志

记录事务日志的, 实现日志持久性

-- 10-15分钟切换的频率计算日志数量、大小
innodb_log_file_size=128M
innodb_log_files_in_group=4


UNDO 表空间

记录事务日志的, 实现事务原子性,你可以吧UNDO表空间放在SSD磁盘

-- 定义阈值, 超过就被截断, 默认1G
innodb_max_undo_log_size=1G
innodb_undo_log_truncate=true

压缩InnoDB表

压缩有助于提高性能和伸缩性。 什么时候压缩?

  • 对于包含字符串列不是特别多且数据读取的次数要比写入的次数多得多的表,压缩最有效。
-- 确保开启如下配置
SET GLOBAL innodb_file_per_table = 1;

-- 创建表
CREATE TABLE [表] ( .. ) ROW_FORMAT_COMPRESSED KEY_BLOCK_SIZE=8;

-- 修改压缩
ALTER TABLE [表] ROW_FORMAT_COMPRESSED KEY_BLOCK_SIZE=8;