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)

你可能感兴趣的:(oracle,数据库)