MySql存储结构

参考视频:MySql存储结构

1.表空间

不同的存储引擎在磁盘文件上的结构均不一致,这里以InnoDB为例:

CREATE TABLE t(id int(11)) Engine = INNODB;

在新表创建的过程中,InnoDB会在磁盘的data目录下创建与这个表对应的两个文件:t.frm、t.ibd。

  • t.frm 存储了表结构等信息,文件相对较小
  • t.ibd 就是常说的”表空间“文件,它用来存储表的数据和索引。文件大小取决于表中的数据量。

注意:只有在mysql5.7版本后才会为每个表生成一个ibd文件,称为独立表空间,在此之前所有表的数据和索引都会存储系统表空间中。系统表空间也被称为共享表空间,即所有表共享一个物理表空间文件。

在mysql8.0之后开始去掉了frm文件,表结构定义默认内置到InnoDB的ibd文件中

我们也可以通过全局参数 innodb file per table 来进行设置。

-- 查看每个表都创建表空间文件状态
SHOW VARIABLES LIKE 'innodb_file_per_table';
-- 开启"每个表都创建表空间文件功能"
SET @@global.innodb_file_per_table= ON;

表空间共分为五类,除了上面说的独立表空间,系统表空间,还有Undo表空间、通用表空间、临时表空间。在官方的的文档中,独立表空间相比于系统表空间,具有可压缩,可传输等优势。

2.页

在ibd文件中,最重要的结构体就是”页“(Pages),即InnoDB中内存和磁盘交互的最小存储单元。Mysql每次内存于磁盘交互数据,都会至少读写一个“页”的大小,因此在磁盘中每个“页”内部的地址都是连续的。

要查询的数据很多情况下都是连续存在的,因此存在这样的机制,只需在磁盘中读取一段连续的数据放入内存(Buffer Pool),后续的查询大概率可以直接从内存中找到。这样就减少了磁盘的访问次数,从而大大提升效率。这一段固定的连续的数据就被称为“页”。

页的大小为固定的16KB,即使没有数据也会占用16KB大小。这16KB的内容具体结构比较多样,在不同的场景会使用不同类型的“页”,一共有12种页类型。但无论什么类型的页均会包含“页头”(File Header)和“页尾”(File Trailer),在页头和页尾之间的页的“主体信息”会根据不同的页类型由不同的结构。

最为常用的就是用来存储数据和索引的“索引页”,它的主体信息会使用数据“行”进行填充。

-- 查看某表的行类型
SELECT t.SPACE,t.NAME,t.ROW_FORMAT FROM information_schema.INNODB_SYS_TABLESPACES

相比页的大小为固定值,行则不同,它是一个最大为8K但大小不固定的结构,内部主要包括表里某一行的真实数据和一些额外信息。

3.区

Mysql所有的表数据都会通过“行”、“页”的方式存储在磁盘中,但是每一个页只有16KB,当要存储的数据和读写量暴增时,跨“页”读取就变得再平常不过了。

如果多个页之间的物理距离过大,那多份数据在磁盘中就很有可能不在同一个磁道。为了读取数据,就会发生磁头移动,这种移动是物理摆动,相比磁片每分钟几千上万次的旋转读取要缓慢得多,所以磁头移动会大大降低性能。

需要尽可能在磁道上读取连续的数据,减少磁头的移动才能提升效率。因此MySql还存在一个叫“区”的结构。每个区都固定为1MB,存放64个连续地址的页,这样即使跨页读取相关数据,大概率都在附近的地址,减少了磁头移动,提高了效率。

于此同时,如果频繁地读取某个“区”内的”页“,Mysql就会将这个区中的所有数据读取出来,放入内存中,减少后续查询对磁盘的访问次数。

当然,在程序员创建新表时,由于不知道表未来的数据大小,为了不至于一次性占用过大的磁盘空间而导致浪费,所以在新建一个表时只会创建6个“页”,而不是一个完整的区,共占用16*6=96KB的大小。

当然在mysql 8.0版本后初次会创建7个页

这些零散”页“会被放在表空间中一个叫碎片区的地方,解析了这6个页后可以看到它们各有不同,其中后两个页为空闲页,即可用页。前4个页分别记录了表空间和区组条目信息、Change buffer相关信息、段信息、索引根信息

当要存储的数据越来越多,6个初始“页”空间不够用的时候,就需要一个一个地新增“页”来满足存储需求,当构建了32个零散”页“之后,后续每次都会直接申请完整的”区“来存储更多的数据。

4.组

然而,当''区“的数量也越来越多时,为了有效地管理区,Mysql又会使用到“组”结构。

每一个“区组”管理固定的256个区,即256MB,它的结构比较简单,就是由256个区直接构成。其中第一个“区组”中的首个“区”的前四页比较特殊,就是之前所说的6个初始页中的前4个:即File Space Header、Insert Buffer Bitmap、File Segment inode、B-tree Node。

而其他区组中首个区的结构均一致,前两个页分别记录了区组条目信息,Change buffer信息,即Extent Descriptor(XDES)、Insert Buffer Bitmap

InnoDB通过“区组”,可以在物理结构层面,非常高效地管理和定位到每个区

5.段

与区、区组这种物理结构不同,”段“是一个逻辑概念,并不对应表空间中连续的物理区域,可以看成区、页的一个附加的标注信息。

段的主要作用是用来区分不同功能的“区”和在碎片区中的”页“,分为”叶子节点段“和”非叶子节点段“等,这两个段与我们常说的B+树索引中的叶子、非叶子节点相对应,也可以简单地理解为“非叶子节点段”存储和管理索引树,“叶子节点段”存储和管理实际数据。

从逻辑上讲,最终由叶子节点段和非叶子节点段等段构成了最终的表空间ibd文件。


day11-MySql存储结构的更多相关文章

  1. mysql 存储结构

    mysql存储结构:数据库->表->数据 1)管理数据库 增:create database sjk; 删:drop database sjk; 改:alter database sjk; ...

  2. MySQL存储结构的使用

    前言 今天公司老大让我做一个MySQL的调研工作,是关于MySQL的存储结构的使用.这里我会通过3个样例来介绍一下MySQL中存储结构的使用过程,以及一些须要注意的点. 笔者环境 系统:Windows ...

  3. Mysql存储结构

    索引是一种加快查询速度的数据结构,常用索引结构有hash.B-Tree和B+Tree.本节通过分析三者的数据结构来说明为啥Mysql选择用B+Tree数据结构. 数据结构 Hash hash是基于哈希 ...

  4. MySQL存储结构及SQL分类

    MySQL目录结构 bin -- mysql执行程序 docs -- 文档 share - 各国编码信息 data -- 存放mysql 数据文件 * 每个数据库 创建一个同名文件夹,.frm 存放t ...

  5. MySQL索引结构原理分析

    我们在学习MySQL的时候经常会听到索引这个词,大概也知道这是什么,但是深究下去又说不出什么道道来.下面将会比较全面的介绍一下关于索引! 1 索引是什么? 这里用百度百科的一句话来说,在关系数据库中, ...

  6. mysql 的 存储结构(储存引擎)

    1 MyISAM:这种引擎是mysql最早提供的.这种引擎又可以分为静态MyISAM.动态MyISAM 和压缩MyISAM三种:    静态MyISAM:如果数据表中的各数据列的长度都是预先固定好的, ...

  7. MySQL InnoDB 逻辑存储结构

    MySQL InnoDB 逻辑存储结构 从InnoDB存储引擎的逻辑结构看,所有数据都被逻辑地存放在一个空间内,称为表空间,而表空间由段(sengment).区(extent).页(page)组成.p ...

  8. MYSQL Innodb逻辑存储结构

    转载于网络 这几天在读<MySQL技术内幕 InnoDB存储引擎>,对 Innodb逻辑存储结构有了些了解,顺便也记录一下: 从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放 ...

  9. mysql之innodb存储引擎---数据存储结构

    一.背景 1.1文件组织架构 首先看一下mysql数据系统涉及到的文件组织架构,如下图所示: msyql文件组织架构图 从图看出: 1.日志文件:slow.log(慢日志),error.log(错误日 ...

  10. MySQL存储引擎MyISAM和InnoDB,索引结构优缺点

    MySQL存储引擎MyISAM和InnoDB底层索引结构 深入理解MySQL索引底层数据结构与算法 (各种索引结构优缺点) Myisam和Innodb索引实现的不同(存储结构) 存储引擎作用于什么对象 ...

随机推荐

  1. Coursera Programming Languages, Part C 华盛顿大学 Week 2

    week 2 我们采用一种新的视角来对比 FP 与 OOP,即将问题分解 (decompose) 与实现 (implement) 的方式 OOP Versus Functional Decomposi ...

  2. Lua监听事件观察者模式(多个监听者监听)

    fireEvent 产生事件,创建协程分发(在registerEventListener注册过的事件中通过事件名字找到对应的信息,然后执行对应模块的OnEvent函数),多个地方都注册了同一个事件的话 ...

  3. 命令提示符怎么打开和Dos命令的基本使用

    Dos命令 Dos命令窗口我们可以通过win+R输入cmd来打开 如果要用管理员身份打开直接在开始里搜索命令提示符,以管理员身份打开! 一些简单的Dos命令 //切换盘符 盘符名: //进入 cd / ...

  4. 05 RDD练习:词频统计

    一.词频统计: 1.读文本文件生成RDD lines 2.将一行一行的文本分割成单词 words flatmap() 3.全部转换为小写 lower() 4.去掉长度小于3的单词 filter() 5 ...

  5. Get Keys In Binary Tree Layer By Layer

    Get the list of list of keys in a given binary tree layer by layer. Each layer is represented by a l ...

  6. mysql-逗号分隔关联查询

    牛逼plus 每天一个知识点 tableA id num 1 1001,1002 2 1002 tableB id num name 1 1001 A 2 1002 B 想要的结果: id name ...

  7. sql 错误问题

    message: ### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: SELECT command denie ...

  8. 在VUE里实现一个简单的中国地图

    如何在vue里面实现一个简单的中国地图,并且实现一些简单的个性化修改. 下面是最终实现的效果图.透明的地图加一个背景图. 1.在你的项目里安装echarts的依赖 npm install echart ...

  9. 1903021126 申文骏 Java 第四周作业 Java分支语句学习

    项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 Java第四周作业 博客名称 1903021126  申文骏  Java 第四周作业 Java分支语句学习 要求 每道题要有题目,代码( ...

  10. element ui动态生成表单数据与校验(后台传入数据)

    前言 最近有一个需求是通过后台返回的数据,生成表单并添加校验.在做的过程中,动态表单挺好做,关键是校验.困扰了我2天,最后通过查找资料和"运气"终于解决了.解决问题关键点:vue的 ...