mysql 学习 - 数据与文件系统的关系解读

数据库和文件系统的关系

什么是文件系统, 操作系统用来管理磁盘的被称为文件系统

像 InnoDB 、 MyISAM 这样的存储引擎都是把表存储在文件系统上的。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们,当我们想写入数据的时候,这些存储引擎会把这些数据又写回文件系统。

MySQL数据目录

MySQL服务器程序在启动时会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中,这个目录就称为数据目录.

数据库对应文件系统的存储结构

使用CREATE DATABASE [数据库名]语句创建一个数据库的时候,在文件系统上实际发生了什么呢?其实很简单,每个数据库都对应数据目录下的一个子目录,或者说对应一个文件夹,我们每当我们新建一个数据库时,MySQL会帮我们做这两件事儿:

在数据目录下创建一个和数据库名同名的子目录(或者说是文件夹)。
在该与数据库名同名的子目录下创建一个名为db.opt的文件,这个文件中包含了该数据库的各种属性,比方说该数据库的字符集和比较规则是个啥。

表对应文件系统的存储结构

我们的数据其实都是以记录的形式插入到表中的,每个表的信息其实可以分为两种:

表结构的定义.
表中的数据

表结构就是该表的名称是啥,表里边有多少列,每个列的数据类型是啥,有啥约束条件和索引,用的是啥字符集和比较规则吧啦吧啦的各种信息,这些信息都体现在了我们的建表语句中了。为了保存这些信息,InnoDB和MyISAM这两种存储引擎都在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件,文件名是这样:表名.frm, 这个后缀名为.frm是以二进制格式存储的,我们直接打开会是乱码的

表中数据对应文件系统的存储结构

在这个问题上,不同的存储引擎就产生了分歧了,下边我们分别看一下InnoDB和MyISAM是用什么文件来保存表中数据的。

InnoDB是如何存储表数据的

回顾一下 innodb 的实现原理:

为了更好的管理这些页,InnoDB 提供了一个表空间或者文件空间.

系统表空间(system tablespace)

这个所谓的系统表空间可以对应文件系统上一个或多个实际的文件,默认情况下,InnoDB会在数据目录下创建一个名为ibdata1,大小为12M的文件,这个文件就是对应的系统表空间在文件系统上的表示。

在一个MySQL服务器中,系统表空间只有一份。从 MySQL5.5.7 到 MySQL5.6.6 之间的各个版本中,我们表中的数据都会被默认存储到这个系统表空间。

独立表空间(file-per-table tablespace)

在MySQL5.6.6以及之后的版本中,InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd的扩展名而已,所以完整的文件名称长这样:
表名.ibd.
.ibd文件就用来存储表中的数据和索引。

MyISAM是如何存储表数据的

MyISAM并没有什么所谓的表空间一说,表数据都存放到对应的数据库子目录下分为三个文件:
test.frm
test.MYD
test.MYI
其中test.MYD代表表的数据文件,也就是我们插入的用户记录;test.MYI代表表的索引文件,我们为该表创建的索引都会放到这个文件中。

表中视图对应文件系统的存储结构

我们知道MySQL中的视图其实是虚拟的表,也就是某个查询语句的一个别名而已,所以在存储视图的时候是不需要存储真实的数据的,只需要把它的结构存储起来就行了。只会存储一个视图名.frm的文件

文件系统对数据库的影响

因为MySQL的数据都是存在文件系统中的,就不得不受到文件系统的一些制约,这在数据库和表的命名、表的大小和性能方面体现的比较明显,比如下边这些方面:

数据库名称和表名称不得超过文件系统所允许的最大长度。
特殊字符的问题
文件长度受文件系统最大长度限制

原文地址:https://www.cnblogs.com/it-dennis/p/12623050.html

时间: 2024-10-27 12:21:03

mysql 学习 - 数据与文件系统的关系解读的相关文章

python之MySQL学习——数据操作

1.增 1 import pymysql as ps 2 3 # 打开数据库连接 4 db = ps.connect(host='localhost', user='root', password='123456', database='test', charset='utf8') 5 6 # 创建一个游标对象 7 cur = db.cursor() 8 9 sql = "INSERT INTO USER(NAME,SEX) VALUES(%s,$s)" 10 11 cur.execu

Mysql学习笔记(三)对表数据的增删改查。

写在前面:(一些牢骚,可以直接跳到分割线后) 太过敏感的人不会快乐,不幸的是我正是这种性格的人. 从培训机构毕业后,迫于经济方面的压力,和当时的班里的一个同学住在了一起,我们在一个公司上班.谁知道这都是不开心生活的源头,从每天早晨开始心情就很糟糕.他是个脾气很慢的人,我是个急脾气,特别是在早上上班的时候.由此种种吧,实在是不胜枚举.算了,还是不说了,太痛苦了,我不太喜欢说别人的坏话.我是学心理学的,已经用各种方法去安慰自己,但是都不太奏效. 回想以往和朋友的交往中,我虽然不算十分合群的人,但绝对

Mysql --学习:大量数据快速导入导出

声明:此文供学习使用,原文:https://blog.csdn.net/xiaobaismiley/article/details/41015783 [实验背景] 项目中需要对数据库中一张表进行重新设计,主要是之前未分区,考虑到数据量大了以后要设计成分区表,同时要对数据库中其他表做好备份恢复的工作. [实验环境] Mysql版本:mysql-5.6.19 操作系统:Ubuntu 12.04 内存:32G CPU:24核  Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00

Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这部分内容需要以下Jar包支持 mysql-connector:MySQL数据库连接驱动,架起服务端与数据库沟通的桥梁: MyBatis:一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架: log4j:Apache的开源项目,一个功能强大的日志组件,提供方便的日志记录: 修改后的pom.xm

MySQL学习笔记之五 有关数据表操作

MySQL在创建表的时候,创建一个.frm文件保存表和列定义.索引存储在一个有.MYI(MYindex)扩展名的文件并且数据存储在有.MYD(MYData)扩展名的文件中.   一.用SHOW/ DESCRIBE语句显示数据表的信息 语法: SHOW TABLES [FROM db_name] [LIKE wild] or SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild] or SHOW INDEX FROM tbl_name [FROM

MySQL学习笔记_4_MySQL创建数据表(下)

 MySQL创建数据表(下) 五.数据表类型及存储位置 1.MySQL与大多数数据库不同,MySQL有一个存储引擎概念.MySQL可以针对不同的存储需求选择不同的存储引擎. 2. showengines; #查看MySQL所支持的存储引擎storageengine 3. showvariables like 'table_type'; #查看默认数据表类型 MyISAM和InnoDB最常用的存储引擎[表类型] 4.指定表类型[使用哪一个存储引擎]: createtable ...() eng

MySQL学习——操作表里的数据

MySQL学习——操作表里的数据 摘要:本文主要学习了使用DML语句操作表里数据的方法. 插入数据 语法 通过传入数据插入: 1 insert into 表名 [(列名1, …, 列名n)] values (值1, …, 值n); 通过查询数据插入: 1 insert into 表名 [(列1, ..., 列n)] 2 select 列1, ..., 列n from 查询的表; 实例 1 mysql> insert into score values (null, '张三', '计算机', 98

MySQL学习——查询表里的数据

MySQL学习——查询表里的数据 摘要:本文主要学习了使用DQL语句查询表里数据的方法. 数据查询 语法 1 select [distinct] 列1 [as '别名1'], ..., 列n [as '别名n'] from 表名 2 [where 表达式] 3 [group by 表达式] 4 [having 表达式] 5 [order by 表达式] 6 [limit 起始编号, 查询条数] 说明 1 列1, ..., 列n:表示查询的字段,查询多个字段用“,”分隔,使用“*”号表示查询全部字

javaweb学习总结(三十四)——使用JDBC处理MySQL大数据

一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时是需要用程序把大文本或二进制数据直接保存到数据库中进行储存的. 对MySQL而言只有blob,而没有clob,mysql存储大文本采用的是Text,Text和blob分别又分为: TINYTEXT.TEXT.MEDIUMTEXT和LONGTEXT TINYBLOB.BLOB.MEDIUMBLOB和L