【MySql】深入解析MySQL底层基础知识:存储引擎、数据结构与磁盘交互

一、引言

MySQL作为一款广泛使用的开源关系型数据库管理系统,其底层基础知识对于数据库管理员和开发者来说至关重要。本文将详细介绍MySQL的存储引擎、数据结构以及数据在磁盘上的存储和读取机制,帮助读者更好地理解MySQL的内部工作原理。

二、MySQL存储引擎详解

1. 存储引擎的定义及作用

存储引擎是MySQL数据库的核心组件,负责数据的存储、查询、更新等操作。它决定了数据如何存储在磁盘上,以及如何被访问。不同的存储引擎具有不同的特性,适用于不同的应用场景。

2. 常见存储引擎及其特点

(1)InnoDB

InnoDB是MySQL默认的存储引擎,支持事务、行级锁定、外键约束和MVCC(多版本并发控制)。它的主要特点如下:

  • 事务支持:
    InnoDB存储引擎最显著的特点是其对事务的全面支持。它遵循ACID原则,确保了数据库操作的原子性、一致性、隔离性和持久性。这意味着即使在系统故障的情况下,事务也能保持完整性和可靠性。
  • 行级锁定:
    InnoDB使用行级锁定机制,与传统的表级锁定相比,行级锁定可以更精确地控制数据访问,减少了并发访问时的锁争用,从而提高了数据库的并发性能。
  • 多版本并发控制(MVCC):
    InnoDB通过MVCC实现了非锁定读取,允许读取操作在不影响写入操作的情况下进行,这对于提高数据库的并发读取性能至关重要。
  • 外键约束:
    InnoDB支持外键约束,这有助于维护数据库中表与表之间数据的关系完整性。通过外键约束,可以确保相关表中的数据符合预定的规则。
  • 崩溃恢复:
    InnoDB具有强大的崩溃恢复能力,它通过事务日志(redo log)和双写缓冲(double write buffer)来保证即使在系统崩溃的情况下,也能恢复到崩溃前的状态。
  • 高性能缓存:
    InnoDB使用缓冲池(buffer pool)来缓存数据和索引,减少了磁盘I/O操作,显著提高了数据库的查询性能。
  • 数据压缩:
    InnoDB支持数据压缩功能,可以减少存储空间的需求,这对于处理大量数据的应用场景非常有用。
  • 在线DDL:
    InnoDB支持在线数据定义语言(DDL),允许在不中断服务的情况下进行表结构的更改,这在维护和升级数据库时提供了极大的便利。

(2)MyISAM

MyISAM是MySQL早期版本的默认存储引擎,不支持事务和行级锁定,但支持全文索引。适用于读多写少的应用场景。其主要特点如下:

  • 非事务支持:
  • MyISAM存储引擎不支持事务,这意味着它不遵循ACID原则。尽管如此,MyISAM在处理非事务性查询时表现出色,因为它不需担心事务的隔离级别,这使得读操作可以更快地执行。
  • 表级锁定:
  • MyISAM使用表级锁定机制,这意味着当一个事务正在修改数据表时,其他事务将无法访问该表。这种锁定机制可能导致锁争用,尤其是在多用户环境中。
  • 全文索引:
  • MyISAM存储引擎支持全文索引,这对于进行文本搜索的应用场景非常有用。全文索引可以加快基于文本内容的查询速度。
  • 压缩表:
  • MyISAM支持压缩表,这可以减少磁盘空间的使用。压缩表的文件大小更小,这有助于提高I/O性能,尤其是在处理大量数据时。
  • 不稳定的索引:
    MyISAM的索引是存储在独立的表文件中的,而不是存储在数据文件中。这使得MyISAM能够快速读取和搜索数据,但也意味着在执行更新操作时,索引需要被重新创建,这可能会影响性能。
  • 简单快速:
    MyISAM存储引擎的简单性使得它在执行某些类型的查询时非常快速,尤其是那些不需要事务保证的场景。
  • 崩溃恢复:
    MyISAM存储引擎在系统崩溃时可能无法保证数据的一致性。为了防止数据丢失,建议定期备份MyISAM表。
  • 不支持外键:
  • MyISAM不支持外键约束,这限制了它维护数据完整性的能力。

(3)Memory

Memory存储引擎将数据存储在内存中,适用于临时表和缓存表。其主要特点如下:

  • 内存存储:
    Memory存储引擎将所有数据和索引存储在服务器内存中,这使得读写操作非常快,因为内存的访问速度远超过磁盘。
  • 临时表:
    Memory存储引擎通常用于创建临时表。临时表在会话结束时自动删除,不会持久化到磁盘。
  • 缓存表:
    Memory存储引擎还可以用于创建缓存表,这些表用于存储经常访问的数据,以提高查询速度。
  • 表大小限制:
    由于数据存储在内存中,因此Memory存储引擎对表的大小有限制。默认情况下,单个表的大小不能超过服务器的内存限制,但在某些配置下,可以通过设置参数来增加表的大小限制。
  • 数据安全性:
    由于数据存储在内存中,一旦服务器重启,所有Memory存储引擎的数据都会丢失。因此,Memory存储引擎不适合存储需要持久化的数据。
  • 数据一致性:
    Memory存储引擎不支持事务,这意味着它不遵循ACID原则。因此,对于需要事务保证的场景,Memory存储引擎不是一个合适的选择。
  • 并发访问:
    Memory存储引擎在多用户环境下可能表现不佳,因为它不支持行级锁定,而是使用表级锁定。这可能导致锁争用,尤其是在多用户访问同一表时。
  • 索引支持:
    Memory存储引擎支持多种类型的索引,包括哈希索引和B树索引。哈希索引对于等值查询非常快,但无法用于范围查询。

(4)Archive

Archive存储引擎适用于存储大量无索引的历史数据,支持高压缩率。其主要特点如下:

  • 压缩率:
    Archive存储引擎提供极高的数据压缩率,这使得它可以节省磁盘空间,尤其是在存储大量数据时。
  • 只支持插入和查询:
    Archive存储引擎不支持更新和删除操作。这意味着一旦数据被插入到表中,它就不能被修改或删除。
  • 不支持索引:
    Archive存储引擎不支持索引,这意味着它不支持快速的数据检索。它主要用于存储不需要快速查询的数据,如日志文件。
  • 顺序读取:
    Archive存储引擎的数据文件以顺序方式存储,这使得它非常适合顺序读取操作,如日志文件的回放。
  • 只读操作:
    由于不支持更新和删除操作,Archive存储引擎的数据只能进行只读操作。这使得它非常适合存储只读数据,如日志文件。
  • 不支持事务:
    Archive存储引擎不支持事务,这意味着它不遵循ACID原则。因此,它不适合需要事务保证的场景。
  • 高写入性能:
    由于不支持索引和只支持顺序读取,Archive存储引擎在写入大量数据时具有很高的性能。

三、MySQL存储的数据结构

1. 红黑树

MySQL数据库中的红黑树(Red-Black Tree)是一种自平衡的二叉搜索树(Binary Search Tree),用于存储索引数据。它保证了树的高度平衡,使得插入、删除和查找操作的时间复杂度保持在O(log n)级别。红黑树的主要特点包括:

  1. 节点颜色:每个节点要么是红色,要么是黑色。
  2. 根节点:根节点是黑色的。
  3. 每个叶子节点:是黑色的空节点(NIL节点),用来表示树的末端。
  4. 红色节点:红色节点不能连续出现,即红色节点之间至少有一个黑色节点。
  5. 黑色高度:从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。

红黑树在MySQL中的主要应用是索引存储。例如,在InnoDB存储引擎中,每个索引(如B-Tree索引)都基于红黑树。这使得索引操作(如插入、删除和查找)能够以较高的效率执行。
以下是一个简化的红黑树数据库结构的示例:

    (RED)/    \(BLACK) (BLACK)/        \
(RED)       (BLACK)/   \
(BLACK)   (BLACK)

在这个结构中,红色节点代表索引键,黑色节点代表索引数据。红黑树确保了即使在数据插入和删除操作后,树的结构仍然保持平衡,从而保证了索引操作的高效性。

请注意,实际的红黑树结构可能会更复杂,并且可能会包含额外的信息,如索引键值、索引类型等。此外,MySQL数据库中的红黑树结构可能会根据具体的存储引擎和索引类型而有所不同。

2. 二叉树

在数据库中,二叉树(Binary Tree)是一种基本的数据结构,它为存储和检索数据提供了一种有序的方式。在MySQL中,二叉树通常用于索引结构,尤其是用于存储索引数据的B-Tree(Balanced Tree)结构。以下是二叉树在MySQL中的基本介绍:

  1. 定义:二叉树是一种树形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树中的每个节点包含一个键值和指向其子节点的指针。
  2. B-Tree结构:在MySQL中,二叉树通常以B-Tree的形式出现。B-Tree是一种自平衡的树形结构,它通过在树中插入和删除节点时进行节点分裂和合并操作,来保持树的平衡。B-Tree的结构特点如下:
    • 节点包含多个键值:每个节点可以包含多个键值,这些键值根据某种排序规则排列。
    • 键值顺序:键值按照某种排序规则(通常是升序或降序)排列,使得树中任意节点的键值都大于其左子节点的键值,小于其右子节点的键值。
    • 子节点包含范围:每个节点的子节点包含的键值范围被限定,使得任意节点的键值都在其左子节点和右子节点的键值范围内。
  3. 二叉树在MySQL中的应用:在MySQL中,二叉树通常用于索引结构。例如,在InnoDB存储引擎中,B-Tree索引是基于B-Tree结构的。这种索引结构使得查询操作能够以较高的效率执行,因为它可以快速定位到包含目标键值的节点。
    以下是一个简化的B-Tree数据库结构的示例:
    (10)/    \(20)   (30)/     \
(40)     (50)

在这个结构中,每个数字代表一个键值。二叉树中的键值按照升序排列,使得树中任意节点的键值都大于其左子节点的键值,小于其右子节点的键值。B-Tree的结构使得查询操作能够以较高的效率执行,因为它可以快速定位到包含目标键值的节点。
请注意,实际的数据库中的B-Tree结构可能会更复杂,并且可能会包含额外的信息,如索引键值、索引类型等。此外,MySQL数据库中的B-Tree结构可能会根据具体的存储引擎和索引类型而有所不同。

四、MySQL数据在磁盘上的存储与读取

1. 数据存储原理

MySQL数据存储在磁盘上的数据文件中,主要包括以下几种文件:

  • .frm文件:存储表结构信息。
  • .ibd文件(InnoDB):存储表数据和索引。
  • .MYD文件(MyISAM):存储表数据。
  • .MYI文件(MyISAM):存储表索引。

2. 数据写入磁盘的过程

(1)写入缓存(Buffer Pool)

当执行写操作时,数据首先写入InnoDB的Buffer Pool中。Buffer Pool是一块内存区域,用于缓存数据和索引。

(2)刷新脏页到磁盘

脏页是指在Buffer Pool中被修改但尚未写入磁盘的数据页。当脏页达到一定比例时,MySQL会触发刷脏页操作,将脏页写入磁盘。

(3)事务日志(redo log)和二进制日志(binlog)

为了保证数据的一致性和可靠性,MySQL使用redo log和binlog记录数据变更操作。在数据写入磁盘前,先写入日志文件。

3. 数据读取过程

(1)缓存命中与未命中的处理

当查询数据时,MySQL首先在Buffer Pool中查找。如果缓存命中,直接返回数据;否则,从磁盘读取数据页到Buffer Pool。

(2)索引查找与全表扫描

MySQL通过索引查找来提高查询效率。如果查询条件包含索引列,MySQL会使用索引进行查找;否则,进行全表扫描。

(3)数据从磁盘到内存的读取流程

当Buffer Pool中没有所需数据时,MySQL会从磁盘读取数据页到Buffer Pool。读取流程如下:

  • 定位数据页:根据数据页的地址,找到其在磁盘上的位置。
  • 读取数据页:将数据页从磁盘读取到Buffer Pool。
  • 更新缓存:将读取到的数据页放入Buffer Pool,以供后续查询使用。

五、总结

本文详细介绍了MySQL的存储引擎、数据结构以及数据在磁盘上的存储和读取机制。了解这些底层基础知识,有助于我们更好地优化数据库性能、处理故障和规划数据库架构。在实际应用中,应根据业务需求选择合适的存储引擎和数据结构,以提高MySQL数据库的使用效率。

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

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

相关文章

怎么自定义spring security对用户信息进行校验及密码的加密校验

先写一个spring security需要校验的字段类 其实UserDetails的子类的user已经有很多字段和功能,但是如果我们需要扩展的话就要重写UserDetails中的方法 package com.lzy.security;import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; impo…

JAVA-常见八股文(4)-内部类和匿名内部类

【参考文献】 Java 中的内部类与匿名内部类详解_内部类和匿名内部类-CSDN博客 内部类以及匿名内部类详解_匿名内部类的作用-CSDN博客 1.内部类 将一个类 A 定义在另一个类 B 里面,里面的那个类 A 就称为内部类,B 则称为外部类。 特点: 内…

Git(分布式版本控制系统)

git介绍: git官网:https://gitee.com/ Git工具安装 Git 公司 (git-scm.com)https://git-scm.com/ git本地配置账号和邮箱 一般刚安装Git都要配置用户名、密码和邮箱,因为你提交代码到本地仓库(上传代码到远程仓库)时…

Nginx的Rewrite和Location配置

目录 一、Rewrite模块 1.功能概述 1.1URL重写 1.2URL重定向 1.3条件判断 1.4重写规则的执行顺序 2.语法格式 2.1Flag说明 3. Rewrite跳转实现 4.常用的Nginx正则表达式 二、Location模块 1.概述 2.分类 2.1精准匹配() 2.2前缀匹配…

游戏如何对抗 IL2cppDumper逆向分析

众所周知,Unity引擎中有两种脚本编译器,分别是 Mono 和 IL2CPP 。相较于Mono,IL2CPP 具备执行效率高、跨平台支持等优势,已被大多数游戏采用。 IL2CPP 模式下,可以将游戏 C# 代码转换为 C 代码,然后编译为…

el-form只对rules中个别字段进行校验

正常属性校验方式 const moveToErr () > {const errorDom document.getElementsByClassName(el-form-item__error);console.log(errorDom)if (errorDom.length) {errorDom[0].scrollIntoView({block: center,behavior: smooth})} };const saveItem async (formEl?: For…

android 折叠屏展开收起监听

折叠屏在展开和收起时,屏幕的物理尺寸会发生变化。你可以通过注册一个ComponentCallbacks2的实例来监听屏幕大小的变化。这个接口提供了onConfigurationChanged(Configuration newConfig)方法,当设备的配置发生变化时(包括屏幕大小和方向&…

python爬虫——入门

一、概念 万维网之所以叫做网,是因为通过点击超链接或者进入URL,我们可以访问任何网络资源,从一个网页跳转到另一个网页,所有的相关资源连接在一起,就形成了一个网。 而爬虫呢,听名字就让人想起来一个黏糊…

string类题目(上)

string类题目 题目来源(Leetcode) 题目一:仅仅反转字母 分析 这个反转的特点在于只反转字母,不反转特殊字符。 法一:如果我们让一个正向迭代器指向第一个字符,让一个反向迭代器指向最后一个字符&#xf…

kafka常用命令汇总

文章目录 命令1命令2命令3命令4命令5命令6命令7命令8命令9 其他说明提示:以下是本篇文章正文内容,Kafka 0.9.x 及更高版本中使用 在使用 Kafka 命令行工具时,–zookeeper 和 --bootstrap-server 参数用于指定不同的连接信息,具体取决于你使用的命令以及 Kafka 版本。 --zo…

ch32v307vct6从头移植FreeRTOS

使用官方的ide可以直接创建带FreeRTOS的工程,但是不利于我们学习移植,所以特此记录怎么从头开始移植FreeRTOS到CH32V307VCT6芯片使用。 下载FreeRTOS源码 首先进入https://www.freertos.org/官网,然后找到如下Download字样,进入下…

华为云通过自定义域名访问桶内对象

问题:通过将自定义域名绑定至OBS桶实现在线预览文件 例如index.html入口文件 且记 自定义域名绑定暂时不支持HTTPS访问方式,只支持HTTP访问方式 自定义域名就先不用部署https证书。 配置完毕之后,将obs桶设置为公开的即可访问 如何在浏览…

Redis为什么会阻塞

Redis的一些阻塞点 BigKey删除,删除数据库,AOF日志同步聚合操作,全量查询操作,从库读取RDB文件。 其中删除BigKey,AOF日志,删除数据库可以异步执行。 聚合操作,全量查询,从库读取RD…

Mysql 集群技术

Mysql在服务器中的部署方法 安装MySQL依赖性 rootmysql-node10 ~]# dnf install cmake gcc-c openssl-devel \ ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 下载并解压源码包 使用命令tar zxf mysql-boost-5.7.44.tar.gz进行解压 源码编译安…

硬件面试经典 100 题(81~90)题

81、请问下图电路中二极管 D1、D2 有什么作用? 在 Vi 输入电压接近于零时,D1、D2 给三极管 T1、T2 提供偏置电压,使 T1、T2 维持导通,以消除交越失真。 陈氏解释 这道题参见:硬件面试经典 100 题(51~70 题…

【自动化】一共获取6600多公司信息【逆向】一页15还加密。

一、【逆向】一页15还加密。 二、【自动化】一共获取6600多公司信息 三、对于两种方式我喜欢第二种自动化 from DrissionPage import ChromiumPage, ChromiumOptions import time # chrome:version co = ChromiumOptions().set_paths(browser_path=r"C:\Users\lenovo\A…

【Java EE】深入理解 Java 线程的生命周期与状态转换

多线程编程在 Java 中是实现高效并发的核心技术之一。每个线程在其生命周期内会经历多个状态,这些状态反映了线程在特定时间点的行为与系统资源的使用情况。了解线程的状态及其转换机制,对于编写健壮的并发程序尤为重要。本文将深入探讨 Java 线程的六种…

python 零星知识点

一、头部注释 在Python脚本中,头部注释(也称为文档字符串或模块级注释)用于提供关于脚本的元数据和描述信息。除了指定解释器和编码方式外,还可以包含其他信息。以下是一些常见的头部注释示例: 1.模块描述 "&qu…

【MySQL】MySQL表的增删改查(初阶)

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 表内容操作 插入内容 按顺序插入 指定某些列插入 一次插入多行记录 插入时间 查询表内容 全列查询 指定列查询 指定表达式查询 用as取别名 ​编辑 去重查询 排序查询…

不同搜索引擎蜘蛛的功能、‌抓取策略与技术实现差异探究

搜索引擎作为互联网信息检索的重要工具,‌其核心功能依赖于背后的“蜘蛛”程序。‌这些蜘蛛程序负责访问互联网上的各种内容,‌并建立索引数据库,‌以便用户能够快速准确地找到所需信息。‌然而,‌不同搜索引擎的蜘蛛在功能、‌抓…