InnoDB建表与表空间
前言:数据在数据库中以磁盘和内存两种方式存在,内存中的数据是为了提升读写的速度,最终所有数据都会刷到磁盘中,而数据库是如何对表的空间进行管理的呢?本篇文章中会有所解释。
1. InnoDB建表与表空间
建表代码:CREATE TABLE t(id int(11))Engine = INNODB;
InnoDB会在C盘的data目录下创建以下两个文件
- frm文件较小
- 在5.7版本后会为每个表生成一个ibd文件,称为独立表空间,在此之前,所有表的数据和索引会存储在“系统表空间“(共享表空间)中,注:系统表空间为所有表共享一个物理表空间文件
也可以通过一下设置来控制是否为每个表创建独立的ibd文件
--开启【每个表都创建表空间文件】
SET @@global.innodb_file_per_table = ON;
--查看【每个表都创建表空间文件】状态
SHOW VARIABLES LIKE 'innodb_file_per+table';
1.1 表空间概述
首先我们需要了解一下什么是表空间,表空间是数据库中用于存储数据和索引的物理文件集合,用于将数据和索引组织在一起,方便管理和维护。表空间可以帮助数据库管理员对数据进行分组管理,也可以用于分配不同的存储设备或文件系统,以优化数据库的性能。
在InnoDB引擎中,表空间是由MySQL数据库管理系统创建的。当使用InnoDB引擎建立表时,MySQL会为该表创建一个默认的表空间,并在该表空间中创建表。如果需要使用多个表空间,可以在建立表时通过指定表空间名称来实现。需要注意的是,创建表空间需要具备创建表空间的权限。
如果还是不太懂,那么更加简单一点,表空间是一个物理的概念,在数据库中,表空间是由一组文件组成的,这些文件通常存储在硬盘上。你可以将表空间想象成一块硬盘空间,它的作用是给Innodb引擎提供一个存储数据的场所。通常情况下,一个数据库中有多张表,每张表都会有对应的表空间,这样就可以将不同的表的数据存储在不同的空间中,保证数据的安全性和独立性。同时,表空间也可以帮助Innodb引擎对数据进行管理和优化,提升数据库的性能。
1.2 五类表空间
好的,接下来让我们分别了解一下五类表空间:
1.系统表空间(System Tablespace):系统表空间是共享表空间模式(下文会讲解)下的一个概念,它包含InnoDB的系统表和索引。这些表和索引的定义在InnoDB存储引擎源代码中,是InnoDB的一部分。
2.共享表空间(Shared Tablespace):共享表空间模式下的所有表都存储在同一个表空间中,也就是说所有的表共享同一个.ibd文件。这个文件包含了所有表的数据和索引。共享表空间是InnoDB存储引擎默认的表空间模式。
3.独立表空间(Per-Table Tablespace):独立表空间模式下每个表都有一个对应的.ibd文件,这个文件包含了表的数据和索引。每个表的数据都被存储在独立的表空间中。
4.UNDO表空间(Undo Tablespace):InnoDB使用Undo表空间来存储事务的Undo日志,Undo日志用于回滚事务。InnoDB支持多个Undo表空间,每个Undo表空间包含多个Undo段。
5.Redo日志文件(Redo Log Files):InnoDB使用Redo日志来记录数据修改的信息,Redo日志文件用于恢复数据。Redo日志文件包含了所有数据文件的变化,因此对于所有的表空间都是必需的。
1.2.1 QA时间
Q:可以理解成innodb在创建表的时候会给表画一个具体的物理空间,用来存放表中的数据和索引吗
- 答案是可以的,InnoDB引擎在创建表的时候,会给表分配一个具体的物理空间,用来存储表中的数据和索引。这个物理空间就是表空间。每个表都有自己的表空间,包含了表的数据文件、索引文件等。这些文件实际上就是表的数据和索引在硬盘上的存储形式。通过分配表空间来管理表的数据和索引,可以提高数据库的性能和可靠性。
Q:依照上一个问题,可以理解成共享表空间模式中不同的表间所存放的数据是在不同的表空间中,但是不同的表又共享一个文件,用来存放索引呢?
- 答案是错误的,如果采用共享表空间模式,所有表的数据和索引都存储在同一个表空间中的共享文件中,而不是每个表都有单独的存储空间。这个共享文件通常称为 "ibdata" 文件,其中包含了 InnoDB 存储引擎的多个数据结构,包括数据页、索引页、Undo 日志和事务日志等。当 InnoDB 引擎需要访问某个表时,它会通过表的元数据信息查找表中的数据和索引所在的具体位置,然后在共享文件中进行读取和写入操作。因此,共享表空间结构中的表并不占用独立的物理空间,而是共享一个物理文件。