> 文章列表 > Mysql 学习(五)Mysql的数据目录

Mysql 学习(五)Mysql的数据目录

Mysql 学习(五)Mysql的数据目录

数据库中数据的存放

  • Mysql中 InnoDB 和 MyISAM 这样的存储引擎都是把数据存储到磁盘上的,而我们把这种存放到磁盘上的东西叫做文件系统,当我们想读取对应数据的时候,就会把数据从文件系统上加载,并且处理返回给我们,当我们要写入的时候,也是写入到这个文件系统
  • 下面我们提一个概念,就是数据目录,这个目录不是安装目录,这是存放数据的目录
  • 我们如何找到数据目录呢?
    • 使用这个语句:SHOW VARIABLES LIKE 'datadir',就可以找到对应下的数据目录
      Mysql 学习(五)Mysql的数据目录

数据目录的结构

  • 首先我们先来创建一个数据:Create DataBase test_sys
    Mysql 学习(五)Mysql的数据目录
  • 猜测一下,文件系统此时会有怎么样的变化?
  • 答案 :
    • 会在上面数据目录下创建一个子文件,这个文件名就是数据库的名字
      Mysql 学习(五)Mysql的数据目录
    • 并且还会在这个目录下创建一个 .opt 文件,这个文件包含了数据库的各种属性
      Mysql 学习(五)Mysql的数据目录

表 在文件系统中的存储

  • 表的存储其实可分为两个部分:
    • 表的结构
    • 表的数据

表的结构

  • 表的结构就是表的相关信息,比如 名称,列名,列的数据类型,约束条件和索引,使用什么字符集等等。
  • 在文件系统上的表示,就是会创建一个 表名.frm 的文件,这个文件是二进制格式存储的,所以打开会乱码,就比如上节 创建的 person 表
    Mysql 学习(五)Mysql的数据目录

表的数据

  • 表的数据在文件系统的存储,这个就需要分引擎了

InnoDB存储表数据

  • InnoDB 其实是使用页为基本单位来存放数据的,而页渔业之间是通过双向链表来维护的,而这些页可以通过B+树来加快查询。
  • InnoDB 的设计就提出一种概念 ,表空间或者文件空间,意思就是 表空间 这个抽象的概念 对应 文件系统上一个或多个真实文件。
  • 而这种表空间又有很多类型:
    • 系统表空间
    • 独立表空间
    • 通用表空间
    • UNDO表空间
    • 临时表空间
  • 接下来我们重点讨论 系统表空间 和 独立表空间
  • 如何使用系统表空间还是独立表空间,这个是根据启动配置里的配置决定:
    • 当innodb_file_per_table的值为0时,代表使用系统表空间
    • 当innodb_file_per_table的值为1时,代表使用独立表空间
[server]
innodb_file_per_table=0
  • 如果想修改已经存在系统表空间中的表转移到独立表空间,可以使用下面的语法:ALTER TABLE 表名 TABLESPACE [=] innodb_file_per_table;
系统表空间
  • 系统表空间 是 整个服务器的数据在文件系统上的表示,默认情况下,InnoDB在数据目录下创建的一个名为 ibdata1 的文件,大小为12M,并且整个文件是自扩展文件,相当于会自己增加文件大小
    Mysql 学习(五)Mysql的数据目录
  • 如果想改默认值,可以在文件启动配置里面配置:
[server]
innodb_data_file_path=文件名:大小autoextend;
  • 在mysql服务器中,系统表空间只有一份
独立表空间
  • 在mysql 5.6.6 之后,InnoDB 不会把默认把各个表的数据存储到系统表空间中,而是为每个表都创建一个独立表空间。
  • 具体表现方式是 ,在对应数据库子文件夹下,创建一个 表名.ibd 的文件
    Mysql 学习(五)Mysql的数据目录
  • 这个文件就是存储 表中的数据和索引

MyISAM存储表数据

  • 因为MyISAM 的索引全部都是二级索引,所以这个引擎存储 索引和数据是分开的,在文件系统中也是通过不同的文件来存储的,具体如下:
    Mysql 学习(五)Mysql的数据目录
  • 其中test.MYD代表表的数据文件,也就是我们插入的用户记录;test.MYI代表表的索引文件,我们为该表创建的索引都会放到这个文件中。

视图 在文件系统中的存储

  • mysql的视图其实是一个虚拟的表,就是某个查询语句的别名,所以存储视图只需要存储他的结构,在文件系统中只会存储一个 视图名.frm的文件

文件体统对于数据库的影响

  • 因为mysql数据都是存储到文件系统中的,所以肯定会受到文件系统的相关影响,比如:
    • 数据库名称和表名称不得超过文件系统所允许的最大长度。
    • 特殊字符的问题
    • 文件长度受文件系统最大长度限制