暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL架构——MySQL如何使用磁盘空间一

本篇将介绍MySQL如何使用磁盘空间。

MySQL使用磁盘空间主要用于5个方面,数据文件路径、数据库文件路径、可执行文件、日志文件,及配置文件。

MySQL主要使用磁盘空间的地方是保存数据文件的路径,默认情况下Linux将其保存在“/var/lib/mysql”。数据文件路径下包含如下文件:

  • 服务器日志文件和状态文件:包含服务器处理的语句的信息,日志用于故障排除、监视、复制,及恢复。InnoDB的redo日志文件和undo表空间保留在数据文件路径。

  • mysql系统数据库文件:MySQL的系统数据库“mysql”包含用户、权限、插件、帮助主题及时区数据。“mysql”数据库中全部的表均使用InnoDB引擎,保存在mysql.ibd表空间文件中。

  • SSL证书

  • InnoDB 日志文件

  • InnoDB系统表空间:包含双写缓冲(double write buffer)和变更缓冲(change buffer)

    • 双写缓冲用于保证写入的崩溃安全

    • 变更缓冲用于变更到二级索引页

  • InnoDB Undo表空间

每个database都会在数据文件路径下生成一个单独的路径,在该路径下面包含此database的数据文件。InnoDB的数据文件以.ibd结尾,包含表数据和元数据。其他存储引擎则使用.sdi元数据文件。

注意,.sdi文件全称为"Serialized Dictionary Information"(序列化字典信息),InnoDB将其与数据保存在.ibd文件,其他的存储引擎将其使用JSON格式单独保存。

InnoDB表空间

InnoDB表空间文件保存一个或多个InnoDB表的数据及其相关的索引。表空间文件包括如下类型:

  • 数据表空间

    • 系统表空间

    • 独立表空间(file per table)

    • 通用表空间

  • Undo表空间

  • 临时表空间


InnoDB系统表空间

InnoDB使用系统表空间存储作为双写缓冲和变更缓冲,里面会包含数据和索引。用户通过“innodb_data_file_path”配置系统表空间文件的位置和大小,默认值为“ibdata1:12M:autoextend”,如果用户配置了两个表空间文件,只有最后的文件可以扩展(无法缩小),例如,“ibdata1:20M;/ext/ibdata2:10M:autoextend”。此外,用户可以通过“innodb_file_per_table”选项指定存储数据和索引是使用系统表空间还是独立表空间。为了便于维护,推荐用户使用独立表空间或者通用表空间。

独立表空间(File-per-Table Tablespaces)

InnoDB的表可以使用一个独立的表空间文件,该文件包含数据、索引及元数据,文件的后缀为.ibd,保存在database的路径下。

独立表空间的优势如下:

  • 压缩表:用户无法混合压缩使用通用表空间或系统空间的表。

  • 空间回收(使用TRUNCATE):InnoDB使用删除重建的方式缩减独立表空间,以释放文件系统空间。

通用表空间(General Tablespaces)

创建一个.ibd文件,包含多个表的数据和索引,不属于任何一个特定的database。使用时需要创建一个通用的表空间文件,之后创建表或者变更表时可以指定该表空间文件。例如,

    CREATE TABLESPACE mytablespace ADD DATAFILE 'mytablespace.ibd';
    CREATE TABLE t1(a INT PRIMARY KEY,b CHAR(8)) TABLESPACE=mytablespace;
    ALTER TABLE T2 TABLESPACE=mytablespace;

    通用表空间的优势如下:

    • 大量删除数据时,减少文件系统的开销。

    • 减少表空间文件元数据使用的内存。


    用户可以将表空间文件存放于数据路径之外,这样带来的好处一是物理上与其他的数据分离,二是可以将这部分数据放在速度更快的设备上。例如,

      CREATE TABLE t1(a INT PRIMARY KEY,b CHAR(4)) DATA DIRECTORY='/datadir2';


      临时表空间

      InnoDB有两种类型的临时表空间:

      • 会话级临时表空间:用于存储用户创建的临时表和优化器创建的内部临时表

        • 当首次要求创建一个磁盘临时表时,系统从临时表空间池中分配一个会话

        • 当服务器启动时,为临时表空间池分配10个临时表空间,池的大小不会缩减,在必要时会增加表空间

        • 一个会话最多分配两个表空间,一个用于用户创建临时表,一个用于优化器创建内部临时表。当会话断开后,临时表空间被删除并释放回临时表空间池

      • 全局临时表空间:用于存储用户生成临时表所做更改的回滚段(Undo日志)

        • 通过“innodb_temp_data_file_path”配置临时表空间文件的路径、名称、大小及属性

        • 默认在数据路径下生成12M自动扩展的ibtmp1文件


      以上内容是MySQL使用磁盘空间中关于表空间的介绍,感谢关注“MySQL解决方案工程师”!

      文章转载自MySQL解决方案工程师,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论