【MySQL】MySQL如何存储元数据?

news2025/3/20 6:01:22

目录

1.数据字典的作用

2. MySQL 8.0 之前的数据字典

3. MySQL 8.0 及之后的数据字典

4.MySQL 8 中的事务数据字典的特征

5.数据字典的序列化

6. .sdi文件的作用:

7..sdi的存储方式


在 MySQL 中,元数据(Metadata) 是描述数据库对象(如表、列、索引、约束等)的结构信息。简单来说,元数据就是描述数据库里有哪些表、表里有哪些列、列是什么类型、谁有权限访问等信息。而数据字典是存储元数据的仓库。

1.数据字典的作用

数据字典存储了数据库的元数据,包括:

  • 数据库对象信息:如表、视图、索引、存储过程、触发器等。
  • 结构信息:如表的结构、列的数据类型、索引的类型等。
  • 约束信息:如主键、外键、唯一约束等。
  • 权限信息:用户和权限的元数据。

通过数据字典,MySQL 可以高效地管理和查询数据库对象的元数据。

2. MySQL 8.0 之前的数据字典

在 MySQL 8.0 之前,数据字典的元数据存储方式包括:

  1. 文件存储:元数据存储在 .frm 文件(表结构文件)、.par 文件(分区表文件)等中。
  2. 系统表:部分元数据存储在 information_schema  系统数据库(虚拟数据库,存储了 MySQL 服务器中所有数据库的元数据,只读)和 mysql 系统数据库中(仅存储 MySQL 核心元数据)。
  3. 在 MySQL 8.0 之前,InnoDB 系统表主要用于存储 InnoDB 存储引擎的内部信息,不用于存储 MySQL 的全局数据字典。

缺点:

  • 非事务性:元数据的更新不是事务性的,可能导致不一致。
  • 性能问题:频繁的文件操作影响性能。
  • 复杂性:元数据分散存储,管理复杂。

3. MySQL 8.0 及之后的数据字典

从 MySQL 8.0 开始,数据字典的实现发生了重大改进:

  • 基于 InnoDB:元数据存储在 mysql 系统数据库中的、使用 InnoDB 存储引擎的表中,而不再存储在 ibdata1 文件里,支持事务性操作。

  • 集中存储:所有元数据集中存储在 mysql 系统数据库下的数据字典表中。

  • 事务性:元数据的更新支持事务,确保一致性。

  • 性能提升:不再依赖 .frm 文件等外部文件存储元数据,减少了文件操作,提高了元数据访问性能。

4.MySQL 8 中的事务数据字典的特征

(1) 是所有 MySQL 服务器子系统的单一元数据存储库

统一存储

  • 在 MySQL 8.0 之前,元数据分散存储在不同的地方(如 .frm 文件、mysql 系统数据库等)。
  • 在 MySQL 8.0 中,所有元数据集中存储在 数据字典表 中,这些表位于 InnoDB 数据字典表空间(mysql.ibd)。

跨存储引擎:虽然不同的存储引擎(如 InnoDB、MyISAM)有自己的用户表,但它们的所有元数据都存储在相同的数据字典表中,这种统一存储简化了元数据的管理和访问。

(2)基于标准 SQL 定义

标准化:数据字典表基于标准 SQL 定义,使用标准的表结构和查询接口。这使得数据字典更易于扩展和维护。

公共数据字典:所有存储引擎共享同一个数据字典,避免了元数据的冗余和不一致。

自动升级:在 MySQL 8.0 中,安装程序会自动处理数据字典的升级,确保从旧版本迁移时的兼容性。

(3)使用事务存储引擎 InnoDB

事务性:数据字典表使用 InnoDB 存储引擎,支持事务性操作(ACID 特性)。这意味着元数据的更新是原子性的,要么全部成功,要么全部失败。

原子 DDL:DDL(数据定义语言)操作(如创建表、修改表结构)现在是原子性的。例如,如果在创建表的过程中发生错误,MySQL 会自动回滚,确保数据库状态一致。

损毁安全:由于数据字典存储在 InnoDB 表空间中,即使发生崩溃或断电,InnoDB 的崩溃恢复机制也能确保元数据的一致性。

(4)改进的 INFORMATION_SCHEMA

性能优化:在 MySQL 8.0 中,INFORMATION_SCHEMA 的实现基于数据字典表,使用了标准的优化技术(如索引、缓存),这使得查询 INFORMATION_SCHEMA 的性能显著提升。

更易于维护:由于 INFORMATION_SCHEMA 直接访问数据字典表,不再需要复杂的文件解析和内存管理,这使得 INFORMATION_SCHEMA 的实现更简洁、更易于维护。

5.数据字典的序列化

在 MySQL 5.6 及之前,InnoDB 存储引擎将所有的数据字典信息存储在共享表空间(即 ibdata1文件)中。这种存储方式存在一些问题:

  • 性能问题:由于数据字典的信息存储在共享表空间中,访问这些元数据时可能导致磁盘 I/O 瓶颈。
  • 恢复效率低:在恢复数据库时,重新加载共享表空间中的数据字典信息可能导致较慢的恢复速度。
  • 无法优化查询:由于数据字典在同一文件中,查询这些信息时的性能可能不是最优的。

因此,从 MySQL 5.7 开始,InnoDB 引入了 序列化字典机制,使得数据字典信息能够更高效地存储和访问。

MySQL 5.7 及以上版本中,InnoDB 使用 .sdi 文件(Serialized Dictionary Information)来专门存储序列化的数据字典信息,采用序列化格式存储。每个数据库会有一个对应的 .sdi 文件,用于存储该数据库的元数据,它包含了关于数据库、表、列、索引等的所有元数据,.sdi 文件中的数据是压缩的、序列化的元数据,MySQL 会在数据库启动时将其反序列化,以便快速访问。

序列化格式:这些元数据被序列化为一种压缩格式,InnoDB 可以在需要时快速反序列化并使用这些信息。这种方式比之前将数据字典存储在共享表空间中更加高效,尤其在高并发访问时能减少锁争用。

序列化:当数据字典信息被更新时(例如创建表、修改列、添加索引等),SDI 文件是将JSON 格式的元数据序列化为二进制数据,存储在 .sdi 文件中。序列化过程确保了元数据存储的高效性,并且节省了空间。

反序列化:在查询或操作数据库对象时,MySQL 会将 .sdi 文件中的序列化数据反序列化为可用的元数据格式。反序列化操作是在需要访问元数据时进行的,通常是高效且快速的。

6. .sdi文件的作用

每次元数据发生更改时(如创建、修改或删除表),MySQL 会自动生成它的副本 .sdi 文件。元数据以 JSON 格式序列化。

  • 元数据备份:在元数据更改时,保存当前状态的副本,便于备份、恢复或迁移
  • 数据一致性:确保元数据与数据文件的一致性,避免损坏或丢失。
  • 跨存储引擎支持:为不同存储引擎(如 InnoDB 和 MyISAM)提供统一的元数据管理机制。

7. .sdi的存储方式

MySQL 根据存储引擎的不同,将 .sdi 存储在不同的位置:

(1)InnoDB 存储引擎

  • 存储位置:存储在 InnoDB 用户表空间 中,与表的数据一起存储。
  • 文件格式被嵌入到表空间文件(.ibd 文件)中,作为表的一部分。
  • 优点:元数据与数据存储在一起,便于管理和恢复。

(2)MyISAM 存储引擎

  • 存储位置:存储在数据库目录中,作为独立的文件。
  • 文件格式:以 .sdi 文件的形式存储,文件名与表名对应。
  • 优点:独立文件便于查看和备份。

Q:那这里就有一个疑问,.sdi文件是如何为不同存储引擎(如 InnoDB 和 MyISAM)提供统一的元数据管理机制?

A:主要通过以下三种方式:

1.统一的元数据格式:无论使用 InnoDB 还是 MyISAM,SDI 的 JSON 结构是统一的,使用 JSON 格式存储元数据。

2.MySQL 提供了一个统一的数据字典 API,用于访问和管理 SDI 数据。无论底层存储引擎是 InnoDB 还是 MyISAM,上层应用(如 MySQL 服务器)都通过相同的接口读取和写入元数据。

3.统一的元数据恢复机制:在数据库崩溃或元数据损坏时,无论是 InnoDB 还是 MyISAM,,MySQL 可以通过 SDI 恢复元数据。当需要将表从一个存储引擎迁移到另一个存储引擎时,SDI 提供了一种统一的元数据表示形式。例如,可以将 MyISAM 表的 .sdi 文件解析后,直接应用到 InnoDB 表。

总之,SDI 通过统一的 JSON 格式和数据字典 API,为不同存储引擎(如 InnoDB 和 MyISAM)提供了一种一致的元数据管理机制。尽管不同存储引擎在物理存储方式上有所差异,但 SDI 确保了元数据的统一性、可移植性和可恢复性,从而简化了 MySQL 的元数据管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2318188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用ASCII字符转化图片

代码 from PIL import Image# 定义 ASCII 字符集,从最暗到最亮 ASCII_CHARS "%#*-:. "def resize_image(image, new_width100):width, height image.sizeratio height / widthnew_height int(new_width * ratio)resized_image image.resize((new_wi…

蓝桥与力扣刷题(蓝桥 组队)

题目:作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容。 每位球员担任 1号位至 5号位时的评分如下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少? 本题为填空题&…

AI Agent系列(六) -基于ReAct架构搭建LLM Agent(Deepseek)

AI Agent系列【六】 一、 ReAct1.1 ReAct 的处理过程:1.1 代码结构 二、 Python代码实现2.1 通过Zero-shot 实现python代码实例Python代码示例1:python代码实现示例2 一、 ReAct ReAct 是 Reseaning 和 Action 两个词的前缀合成,代表着先推…

AnyTouch:跨多个视觉触觉传感器学习统一的静态动态表征

25年3月来自人大、武汉科技大学和北邮的论文“AnyTouch: Learning Unified Static-dynamic Representation Across Multiple Visuo-tactile Sensors”。 视觉触觉传感器旨在模拟人类的触觉感知,使机器人能够精确地理解和操纵物体。随着时间的推移,许多精…

YOLOv11 目标检测

本文章不再赘述anaconda的下载以及虚拟环境的配置,博主使用的python版本为3.8 1.获取YOLOv11的源工程文件 链接:GitHub - ultralytics/ultralytics: Ultralytics YOLO11 🚀 直接下载解压 2.需要自己准备的文件 文件结构如下:红…

VSCode C/C++ 环境搭建指南

一、前言 Visual Studio Code(简称 VSCode)是一款轻量级且功能强大的跨平台代码编辑器,凭借丰富的插件生态和高度的可定制性,深受开发者喜爱。对于 C/C 开发者而言,在 VSCode 中搭建开发环境,能够获得灵活…

Python 中下划线 “_” 的多面性:从变量到约定

# Python中下划线“_”的多面性:从变量到约定 在Python的语法体系里,下划线“_”看似毫不起眼,实则扮演着极为重要且多样化的角色。它不仅能作为普通变量参与编程,更在多个特殊场景下有着独特的用途与约定。深入理解下划线的各种…

Vue3项目开发:状态管理实践指南

# Vue3项目开发:状态管理实践指南 一、引言 背景介绍 在Vue项目中,状态管理是一个非常重要的话题。合理的状态管理能够帮助我们更好地组织和管理数据,提升项目的可维护性和可扩展性。本文将深入探讨Vue3项目中状态管理的最佳实践,…

数据结构-------栈

顺序栈: 一、数据结构定义 数据元素 DATATYPE typedef struct person {char name[32];char sex;int age;int score; } DATATYPE;顺序栈结构 SeqStack typedef struct list {DATATYPE *head; // 栈空间首地址int tlen; // 栈总容量(total leng…

机器学习概要

文章目录 一、什么是机器学习 二、机器学习的种类 1. 有监督学习 2. 无监督学习 3.强化学习 三、机器学习的应用 四、机器学习的步骤 1. 数据的重要性 2. 数据和学习的种类 3. 可视化 一、什么是机器学习 机器学习指的是计算机根据给定的问题、课题或环境进行学习&a…

【LangChain入门 2 Model组件】开始!LLM Models简单对话

文章目录 一、使用langchain_ollama二、采用DeepSeek的API三、Model 介绍3.1 OllamaLLM 预训练模型3.2 ChatOllama 聊天预训练模型3.3 OllamaEmbeddings 实现一个helloworld,跑通一个简单的对话。 后面章节会正式介绍LangChain的各个功能。 后台llm的端口可以任意选…

C++20 中线程管理与取消机制的深度剖析

文章目录 std::jthread:更智能的线程管理背景与优势构造函数与 std::stop_token 的集成 std::stop_token、std::stop_source 和 std::stop_callback:灵活的取消机制std::stop_token:取消请求的指示器std::stop_source:取消请求的发…

Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析

Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析 一、Teleport:突破组件层级的时空传送 1.1 实现原理图解 #mermaid-svg-75dTmiektg1XNS13 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…

FPGA——实现LED流水灯

文章目录 一、Quartusll_18.1和VS Code软件的关联二、DE2-115的时钟电路三、流水灯的分层次设计四、总结 一、Quartusll_18.1和VS Code软件的关联 1.先打开Quartus II 软件,然后选择菜单栏“Tools”下的“Options…”。 2.点击“Options…”,在弹出的对…

Excel 小黑第12套

对应大猫13 涉及金额修改 -数字组 -修改会计专用 VLOOKUP函数使用(查找目标,查找范围(F4 绝对引用),返回值的所在列数,精确查找或模糊查找)双击填充柄就会显示所有值 这个逗号要中文的不能英…

滚动元素的新api

点击的时候需要双重视图滚动 itemClick(id) {// 滚动到对应位置this.$nextTick(() > {// 找到对应 id 在 initList2 中的索引const index this.initList2.findIndex((item) > item.id Number(id));if (index ! -1) {// 获取所有菜单项const menuItems document.queryS…

多机调度问题(C语言)

代码如下&#xff1a; #include<stdio.h> #include<stdlib.h>int compare(void* a, void* b)//比较函数&#xff0c;用于qsort按处理时间从大到小排序 {return *(int*)a - *(int*)b; }int LPT(int jobs[], int n, int m)//多机调度问题的LPT算法 {qsort(jobs, n, …

烽火HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包及注意点说明

之前发布过这个固件包&#xff0c;关于烽火HG680-KA&#xff0f;HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包详细说明一下&#xff0c;汇总总结一些常遇到的情况&#xff0c;这次固件会分开发布&#xff0c;以免混淆。 上一个帖子地址&#xff1a;烽火HG680-KA&#xff0…

996引擎 - 红点系统

996引擎 - 红点系统 总结NPC 红点(TXT红点)Lua 红点1. Red_Point.lua2. UI_Ex.lua参考资料以下内容是在三端 lua 环境下测试的 总结 红点系统分几个部分组成。 M2中设置变量推送。 配置红点表。 Envir\Data\cfg_redpoint.xls 2.1. UI元素中找到ID填写 ids 列。 主界面挂载…

3.17BUUCTF练习day1

BUUCTF练习day1 [极客大挑战 2019]EasySQL1&#xff08;字符型&#xff0c;账号密码型&#xff0c;get型&#xff09; 判断闭合方式 在用户名输入1‘&#xff0c;此时密码先输入任何数字时&#xff0c;出现语法错误 说明闭合方式为单引号闭合&#xff0c;在判断完闭合方式后…