• MYSQL的系统数据表空间,用户数据表空间,系统临时表空间,用户临时表空间详解


    系统数据表空间:
    系统表空间可以有一个或多个数据文件。默认情况下,会在数据目录中创建一个名为ibdata1的系统表空间数据文件 。系统表空间数据文件的大小和数量由innodb_data_file_path启动选项定义。

    mysql> show variables like '%innodb_data%';
    +-----------------------+------------------------+
    | Variable_name         | Value                  |
    +-----------------------+------------------------+
    | innodb_data_file_path | ibdata1:12M:autoextend |
    | innodb_data_home_dir  |                        |
    +-----------------------+------------------------+
    2 rows in set (0.02 sec)

    它里面存储的有:

    InnoDB 表元数据
    doublewrite buffer
    change buffer
    undo logs

    1.InnoDB 表元数据:  只读的表,存储对象的相关信息,如占用空间,列的缺省值,约束信息,用户名,权限,审计信息等; 虽 然 InnoDB 表 元 数 据 通 过 information_schema.tables 来 读 取 , 但 是 实 际 上
    information_schema 是一个虚拟数据库,并不物理存在,这些数据真正存放的地方就是 ibdata1

    2.双写缓冲区 Double write buffer:; Innodb写入数据默认是16k/pages为一个单位写入,而磁盘是4k/page一个单位,为了防止写入一半,断电无法恢复数据的情况发生,引入了double writer buffer机制;double write buffer是一段连续空间,大小2M(128 page),数据写入的时候先写到doublewrite空间,然后再写入到磁盘,如果发生写入了一个page一半的时候断电,恢复后会自动从doublewrite中恢复;
    3.插入缓冲区INSERT BUFFER:针对辅助索引(非unique),插入数据的时候,先将插入的数据在buffer中根据辅助索引叶子节点的Page_no排序,而后按照Page_no分批次插入,提高性能;
    4.undo log;用于记录事物变更前的状态,如果未commit,其他session可以查看到变更前状态


    用户数据表空间:
    由 innodb_file_per_table 参数定义。启用后(innodb_file_per_table=1),InnoDB 可以在 file-per-table 表空间中创建表,存储在表名相同的ibd和frm文件中,这样新创建的数据库表都单独的表空间文件。该参数在 MySQL 5.6.7 及更高版本已经默认启用了。

    临时表空间
    非压缩的、用户创建的临时表和磁盘上产生的内部临时表都是存储在共享的临时表空间存储的,可以通过配置参数 innodb_temp_data_file_path 来定义临时表空间数据文件的路径、名称、大小和属性,如果没有指定,默认是在数据目录下创建一个名为 ibtmp1的大于 12M 的自动扩展数据文件。

    mysql> show variables like '%innodb_temp%';
    +----------------------------+-----------------------+
    | Variable_name              | Value                 |
    +----------------------------+-----------------------+
    | innodb_temp_data_file_path | ibtmp1:12M:autoextend |
    +----------------------------+-----------------------+
    1 row in set (0.01 sec)

    mysql> show variables like '%innodb_tmp%';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | innodb_tmpdir |       |
    +---------------+-------+
    1 row in set (0.00 sec)

    那MYSQL用户可以自己创建自定义的表空间吗?可以:

    CREATE TABLESPACE myspacetest ADD DATAFILE 'myspacetest.ibd' ENGINE=InnoDB;
    CREATE TABLE mytable ( id INT PRIMARY KEY ) TABLESPACE myspacetest;
    mysql> insert into mytable value(34);
    Query OK, 1 row affected (0.01 sec)

    查看已存在的表空间和对于的文件:
    mysql> select TABLESPACE_NAME,FILE_NAME  from information_schema.FILES;
    +--------------------------+---------------------------------------+
    | TABLESPACE_NAME          | FILE_NAME                             |
    +--------------------------+---------------------------------------+
    | innodb_system            | ./ibdata1                             |
    | innodb_file_per_table_30 | ./mysql/Course.ibd                    |
    | innodb_file_per_table_32 | ./mysql/SC.ibd                        |
    | innodb_file_per_table_31 | ./mysql/Student.ibd                   |
    | innodb_file_per_table_20 | ./mysql/engine_cost.ibd               |
    | innodb_file_per_table_18 | ./mysql/gtid_executed.ibd             |
    | innodb_file_per_table_5  | ./mysql/help_category.ibd             |
    | innodb_file_per_table_7  | ./mysql/help_keyword.ibd              |
    | innodb_file_per_table_6  | ./mysql/help_relation.ibd             |
    | innodb_file_per_table_4  | ./mysql/help_topic.ibd                |
    | innodb_file_per_table_14 | ./mysql/innodb_index_stats.ibd        |
    | innodb_file_per_table_13 | ./mysql/innodb_table_stats.ibd        |
    | innodb_file_per_table_2  | ./mysql/plugin.ibd                    |
    | innodb_file_per_table_19 | ./mysql/server_cost.ibd               |
    | innodb_file_per_table_3  | ./mysql/servers.ibd                   |
    | innodb_file_per_table_16 | ./mysql/slave_master_info.ibd         |
    | innodb_file_per_table_15 | ./mysql/slave_relay_log_info.ibd      |
    | innodb_file_per_table_17 | ./mysql/slave_worker_info.ibd         |
    | innodb_file_per_table_9  | ./mysql/time_zone.ibd                 |
    | innodb_file_per_table_12 | ./mysql/time_zone_leap_second.ibd     |
    | innodb_file_per_table_8  | ./mysql/time_zone_name.ibd            |
    | innodb_file_per_table_10 | ./mysql/time_zone_transition.ibd      |
    | innodb_file_per_table_11 | ./mysql/time_zone_transition_type.ibd |
    | innodb_file_per_table_38 | ./mytest/t1.ibd                       |
    | innodb_file_per_table_21 | ./sys/sys_config.ibd                  |
    | innodb_temporary         | ./ibtmp1                              |
    | innodb_file_per_table_43 | ./mysql/employee.ibd                  |
    | innodb_file_per_table_44 | ./mysql/employee1.ibd                 |
    | myspacetest              | ./myspacetest.ibd                     |
    +--------------------------+---------------------------------------+

    那MYSQL可以在系统表空间里创建表吗?可以,实际上innodb_file_per_table没打开的情况下,默认会把表建在ibdata1里


    mysql> CREATE TABLE mytable1 ( id INT PRIMARY KEY ) TABLESPACE innodb_system;
    Query OK, 0 rows affected (0.01 sec)

    mysql> insert into mytable1 values(23);
    Query OK, 1 row affected (0.00 sec)

  • 相关阅读:
    在 Mac 上将 PDF 转换为 PowerPoint 的 5 种解决方案
    react高阶成分(HOC)实践例子
    重温 JavaScript 系列(2):数组去重、类数组转换数组
    Vue3中使用Element-Plus分页组件
    在华为云服务器上CentOS 7安装单机版Redis
    华为机试练习题:HJ14 字符串排序
    vr地铁消防虚拟逃生自救系统降低财产及人员伤害
    力扣题解12-15
    Jmeter 入门 从0-1 基础篇-实操
    (四)、传热学-热传导问题的数值解法
  • 原文地址:https://blog.csdn.net/liys0811/article/details/132670619