我们知道,像InnoDB、MyISAM这样的储存引擎都是把资料存在磁碟里,而作业系统是使用档案系统管理磁碟的,所以我们也可以说像InnoDB、MyISAM这样的储存引擎都是把资料存在档案系统上。
当我们要读取时,储存引擎从档案系统中读取资料出来给我们,写入的时候,储存引擎一样将资料写回档案系统中。
今天就是要说明InnoDB、MyISAM这两个储存引擎的资料如何在档案系统中储存。
先来看看Mysql的资料目录在那里
mysql> show variables like 'datadir';
+---------------+-----------------------+
| Variable_name | Value |
+---------------+-----------------------+
| datadir | /usr/local/var/mysql/ |
+---------------+-----------------------+
1 row in set (0.23 sec)
以下为我本机的Mysql资料库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| my_database |
| mydatabase |
| mysql |
| performance_schema |
| ryan_demo_db |
| sys |
+--------------------+
7 rows in set (0.07 sec)
再来Mysql运行过程中会产生许多资料,像是我们建立的资料库、表以及一些让程序顺利运行额外的资料等。
我们一个个来看
当建立资料库的时候Mysql会做两件事:
看看我的Mysql资料目录
(base) ➜ bin cd /usr/local/var/mysql
(base) ➜ mysql ls -alt
total 12608648
-rwxrwxrwx 1 ryanlai admin 50331648 9 10 18:27 ib_logfile0
-rwxrwxrwx 1 ryanlai admin 27262976 9 10 18:27 undo_002
-rwxrwxrwx 1 ryanlai admin 27262976 9 10 18:27 undo_001
-rw-r----- 1 ryanlai admin 196608 9 10 18:27 #ib_16384_0.dblwr
-rwxrwxrwx 1 ryanlai admin 12582912 9 10 18:27 ibdata1
-rwxrwxrwx 1 ryanlai admin 50331648 9 10 18:27 ib_logfile1
-rw-r----- 1 ryanlai admin 844245421 9 10 18:27 binlog.000020
-rwxrwxrwx 1 ryanlai admin 41943040 9 10 18:15 mysql.ibd
drwxrwxrwx 51 ryanlai admin 1632 9 10 18:00 .
-rw-r----- 1 ryanlai admin 256 9 10 18:00 binlog.index
-rw-r----- 1 ryanlai admin 1073742006 9 10 18:00 binlog.000019
-rw-r----- 1 ryanlai admin 1073742006 9 10 17:07 binlog.000018
-rw-r----- 1 ryanlai admin 1073742163 9 10 16:12 binlog.000017
-rw-r----- 1 ryanlai admin 1073741930 9 10 15:05 binlog.000016
-rw-r----- 1 ryanlai admin 1073742113 9 10 14:26 binlog.000015
-rw-r----- 1 ryanlai admin 8585216 9 10 14:12 #ib_16384_1.dblwr
drwxr-x--- 6 ryanlai admin 192 9 10 13:42 ryan_demo_db
-rw-r----- 1 ryanlai admin 12582912 9 10 10:10 ibtmp1
-rw-r----- 1 ryanlai admin 4441 9 10 10:09 MacBook-Pro-76.local.err
-rw-r----- 1 ryanlai admin 6 9 10 10:09 MacBook-Pro-76.local.pid
-rw-r----- 1 ryanlai admin 156 9 10 10:09 binlog.000014
drwxr-x--- 12 ryanlai admin 384 9 10 10:09 #innodb_temp
-rw-r----- 1 ryanlai admin 3664 9 9 12:43 binlog.000013
drwxr-x--- 2 ryanlai admin 64 9 5 15:36 mydatabase
drwxr-x--- 5 ryanlai admin 160 9 3 16:33 my_database
-rw-r----- 1 ryanlai admin 6 9 3 14:08 MacBook-Pro-76.pid
-rw-r----- 1 ryanlai admin 156 9 3 14:08 binlog.000012
-rw-r----- 1 ryanlai admin 156 9 3 13:41 binlog.000011
-rw-r----- 1 ryanlai admin 156 9 3 11:16 binlog.000010
-rw-r----- 1 ryanlai admin 156 9 3 11:08 binlog.000009
-rw-r----- 1 ryanlai admin 156 9 3 10:58 binlog.000008
-rw-r----- 1 ryanlai admin 200 9 3 10:54 binlog.000007
-rw-r----- 1 ryanlai admin 8709 9 3 10:39 ib_buffer_pool
-rw-r----- 1 ryanlai admin 179 9 3 10:39 binlog.000006
-rw-r----- 1 ryanlai admin 6 9 2 12:49 mysql_upgrade_info
drwxrwxrwx 8 ryanlai admin 256 9 2 12:49 mysql
-rw-r----- 1 ryanlai admin 5905 9 2 12:48 MacBook-Pro-76.err
-rw-r----- 1 ryanlai admin 346 9 2 12:48 binlog.000005
drwxrwxrwx 112 ryanlai admin 3584 7 10 12:57 performance_schema
drwxrwxr-x 11 ryanlai admin 352 6 16 11:53 ..
drwxrwxrwx 3 ryanlai admin 96 3 31 2019 sys
-rw-r----- 1 _mysql admin 592 7 17 2018 Ryande-Air.err
-rw-r----- 1 ryanlai admin 56 7 17 2018 auto.cnf
-rwxrwxrwx 1 ryanlai admin 452 7 17 2018 public_key.pem
-rwxrwxrwx 1 ryanlai admin 1680 7 17 2018 private_key.pem
-rwxrwxrwx 1 ryanlai admin 1112 7 17 2018 client-cert.pem
-rwxrwxrwx 1 ryanlai admin 1676 7 17 2018 client-key.pem
-rwxrwxrwx 1 ryanlai admin 1112 7 17 2018 server-cert.pem
-rwxrwxrwx 1 ryanlai admin 1676 7 17 2018 server-key.pem
-rwxrwxrwx 1 ryanlai admin 1112 7 17 2018 ca.pem
-rwxrwxrwx 1 ryanlai admin 1680 7 17 2018 ca-key.pem
可以看到除了information_schema这个系统资料库外(MySQL的工程师特殊处理),其他资料库在资料目录下都有对应的子目录。
再看到ryan_demo_db资料库里面
(base) ➜ mysql cd ryan_demo_db
(base) ➜ ryan_demo_db ls -alt
total 1794592
-rw-r----- 1 ryanlai admin 901775360 9 10 18:27 per2.ibd
drwxrwxrwx 51 ryanlai admin 1632 9 10 18:00 ..
-rw-r----- 1 ryanlai admin 11534336 9 10 13:56 single_table.ibd
drwxr-x--- 6 ryanlai admin 192 9 10 13:42 .
-rw-r----- 1 ryanlai admin 114688 9 7 16:29 ryan_demo2_table.ibd
-rw-r----- 1 ryanlai admin 114688 9 7 15:40 ryan_demo_table.ibd
却没有看到子目录里面并没有db.opt的档案(因为我是Mysql8.0版本)。
我们的资料其实都是以纪录的形式插入到表中。
表的资讯有两个部分:
表结构定义。表的名称是什麽、表有多少列、每列的资料类型是什麽、有什麽限制条件跟索引、用什麽字元集和比较规则等资讯。
表中的资料
这些描述表结构的资讯会在对应的资料库子目录下(ex:/usr/local/var/mysql/ryan_demo_db)创建.frm档来保存(但一样在Mysql8.0移除了)。
而表中的资料在不同的储存引擎会有不同的方式。
Innodb
设计Innodb的工程师提出了表格空间(档案空间)的概念。这是一个抽象概念,它可以对应档案系统上一个或多个真实档案(不同表格空间对应的档案数量可能不同)。每个表格空间被划分为很多页,表资料就存放在表格空间下的页里面。
表格空间有几种类型
(base) ➜ mysql ls -alt
total 12608648
-rwxrwxrwx 1 ryanlai admin 50331648 9 10 18:27 ib_logfile0
-rwxrwxrwx 1 ryanlai admin 27262976 9 10 18:27 undo_002
-rwxrwxrwx 1 ryanlai admin 27262976 9 10 18:27 undo_001
-rw-r----- 1 ryanlai admin 196608 9 10 18:27 #ib_16384_0.dblwr
-rwxrwxrwx 1 ryanlai admin 12582912 9 10 18:27 ibdata1
(base) ➜ ryan_demo_db ls -alt
total 1794592
-rw-r----- 1 ryanlai admin 901775360 9 10 18:27 per2.ibd
drwxrwxrwx 51 ryanlai admin 1632 9 10 18:00 ..
-rw-r----- 1 ryanlai admin 11534336 9 10 13:56 single_table.ibd
drwxr-x--- 6 ryanlai admin 192 9 10 13:42 .
-rw-r----- 1 ryanlai admin 114688 9 7 16:29 ryan_demo2_table.ibd
-rw-r----- 1 ryanlai admin 114688 9 7 15:40 ryan_demo_table.ibd
这里每一个.ibd档案就是对应的独立表格空间在档案系统里的表示(一个table一个.ibd档)
补充说明,可以由启动选项innodb_file_per_table决定是否要将表资料储存在系统表格空间(innodb_file_per_table=0)还是独立表格空间(innodb_file_per_table=1)。
MyISAM
主要差异是,Innodb资料和索引是同一回事,但MyISAM是分开的,在档案系统会是用不同的档案来存放资料和索引。MyISAM也没有表格空间一说,资料和索引就存放在对应的资料库目录下。
我的MyISAM资料库(Mysql8.0)如下
(base) ➜ mysql cd my_database
(base) ➜ my_database ls -alt
total 16
drwxrwxrwx 51 ryanlai admin 1632 9 13 13:22 ..
-rw-r----- 1 ryanlai admin 1024 9 3 16:33 new_table.MYI
drwxr-x--- 5 ryanlai admin 160 9 3 16:33 .
-rw-r----- 1 ryanlai admin 0 9 3 16:33 new_table.MYD
-rw-r----- 1 ryanlai admin 2786 9 3 16:33 new_table_892.sdi
.MYD就是表的资料档案(使用者纪录),.MYI表示表的索引档案,.sdi就是表的结构(Mysql8.0版本以前是.frm档)。
因为Mysql资料都是存在档案系统的,因此就不得不受到档案系统的一些限制。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| my_database |
| mydatabase |
| mysql |
| performance_schema |
| ryan_demo_db |
| sys |
+--------------------+
7 rows in set (0.07 sec)
<<: [Tableau Public] day 13:进阶版的表格呈现方式
Props 与 Computed 是开发元件最常使用的属性,下面的范例是一个运用 Props 与 C...
接下来的篇章我们会把目光聚焦於 interfaces/ 这个目录底下的内容,想确认 slate p...
人的科技文明发展始终来自於人性 随着科技的一路发展,人类的文明与科技水准一路向上的平稳,再发展的过程...
完赛检讨 资料处理 虽然我们有大致上把红框等杂讯去除掉,但我们还是没有完全把照杂讯清除乾净。 Yol...
FontAwesome FontAwesome 让我们可以快速方便的使用 Icon 的设计,不过他有...