当前位置: 首页 > article >正文

【数据库】通俗易懂掌握MySQL存储最小单位及数据存取过程

MySQL是一种广泛使用的关系型数据库管理系统(RDBMS),它的核心功能是存储和管理数据。要深入理解MySQL的工作原理,首先需要了解它的存储最小单位以及数据存取过程。此外,MySQL支持多种存储引擎(如InnoDB、MyISAM等),不同的存储引擎在数据存取过程中会有一些区别。本文将通过丰富的案例和通俗易懂的解释,帮助你掌握这些核心概念。


1. MySQL存储的最小单位:页(Page)

1.1 什么是页?

在MySQL中,页(Page) 是存储数据的最小单位。页的大小通常是 16KB(可以通过配置修改),所有的数据(如表数据、索引数据)都以页的形式存储在磁盘上。

1.2 页的结构

一个页通常包含以下几个部分:

  • 页头(Page Header):存储页的元信息,如页的类型、页号等。
  • 数据行(Rows):存储实际的数据记录。
  • 页尾(Page Footer):存储页的校验信息,用于检测数据是否损坏。

1.3 页的作用

  • 提高读写效率:MySQL以页为单位从磁盘读取数据,减少了磁盘I/O次数。
  • 管理数据:页是MySQL管理数据的基本单位,所有的增删改查操作都是在页的基础上进行的。

2. 数据存取过程

2.1 数据存储过程

当我们向MySQL插入一条数据时,MySQL会按照以下步骤存储数据:

  1. 分配页:MySQL会找到一个空闲的页来存储数据。
  2. 写入数据:将数据写入页的数据行部分。
  3. 更新索引:如果表有索引,MySQL会更新索引页以反映新数据的位置。
案例:插入一条数据

假设我们有一个表users,结构如下:

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

当我们执行以下插入语句时:

INSERT INTO users (id, name) VALUES (1, 'Alice');

MySQL会:

  1. 找到一个空闲的页。
  2. (1, 'Alice')写入页的数据行部分。
  3. 更新主键索引,记录id=1的数据所在的页号。

2.2 数据读取过程

当我们查询数据时,MySQL会按照以下步骤读取数据:

  1. 查找索引:MySQL会先查找索引,确定数据所在的页号。
  2. 读取页:根据页号从磁盘读取页到内存。
  3. 返回数据:从页中提取目标数据并返回。
案例:查询一条数据

假设我们执行以下查询语句:

SELECT * FROM users WHERE id = 1;

MySQL会:

  1. 查找主键索引,找到id=1的数据所在的页号。
  2. 从磁盘读取该页到内存。
  3. 从页中提取(1, 'Alice')并返回。

3. 页与磁盘的关系

3.1 页的磁盘存储

MySQL的数据最终存储在磁盘上,而页是磁盘和内存之间的桥梁。当MySQL需要读取数据时,它会将页从磁盘加载到内存;当数据被修改时,MySQL会将页从内存写回磁盘。

3.2 缓冲池(Buffer Pool)

为了提高性能,MySQL引入了缓冲池(Buffer Pool)。缓冲池是内存中的一块区域,用于缓存磁盘上的页。当MySQL需要读取数据时,它会先检查缓冲池中是否已经缓存了目标页。如果已经缓存,则直接从内存读取;如果没有缓存,则从磁盘加载页到缓冲池。

案例:缓冲池的作用

假设我们多次执行以下查询:

SELECT * FROM users WHERE id = 1;
  • 第一次查询时,MySQL会从磁盘加载页到缓冲池。
  • 后续查询时,MySQL会直接从缓冲池读取页,避免了磁盘I/O。

4. 不同存储引擎的数据存取过程

MySQL支持多种存储引擎,最常见的是 InnoDBMyISAM。它们在数据存取过程中有一些区别。

4.1 InnoDB存储引擎

InnoDB是MySQL的默认存储引擎,支持事务、行级锁和外键。它的数据存取过程如下:

  • 数据存储:InnoDB使用聚簇索引,数据行直接存储在索引的叶子节点中。
  • 数据读取:通过索引查找数据时,InnoDB会直接定位到数据行所在的页。
  • 事务支持:InnoDB通过undo logredo log实现事务的原子性和持久性。
案例:InnoDB的数据存取

假设我们有一个InnoDB表orders

CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    amount DECIMAL(10, 2)
) ENGINE=InnoDB;

当我们插入一条数据时:

INSERT INTO orders (id, user_id, amount) VALUES (1, 100, 99.99);

InnoDB会:

  1. 将数据行存储在聚簇索引的叶子节点中。
  2. 更新索引以反映新数据的位置。

4.2 MyISAM存储引擎

MyISAM是MySQL的另一种存储引擎,不支持事务和行级锁,但查询速度较快。它的数据存取过程如下:

  • 数据存储:MyISAM将数据和索引分开存储。数据存储在.MYD文件中,索引存储在.MYI文件中。
  • 数据读取:通过索引查找数据时,MyISAM会先查找索引文件,然后根据索引指向的位置从数据文件中读取数据。
案例:MyISAM的数据存取

假设我们有一个MyISAM表products

CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(50)
) ENGINE=MyISAM;

当我们插入一条数据时:

INSERT INTO products (id, name) VALUES (1, 'Laptop');

MyISAM会:

  1. 将数据行存储在.MYD文件中。
  2. 更新索引文件.MYI以反映新数据的位置。

5. 数据存取过程的优化

5.1 索引的作用

索引是MySQL优化数据存取的重要工具。它类似于书籍的目录,可以帮助MySQL快速定位数据所在的页。

案例:索引的使用

假设我们有一个包含100万条记录的表orders,结构如下:

CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    amount DECIMAL(10, 2)
);

如果我们执行以下查询:

SELECT * FROM orders WHERE user_id = 100;

如果没有索引,MySQL需要扫描整个表(全表扫描),效率很低。如果我们在user_id上创建索引:

CREATE INDEX idx_user_id ON orders (user_id);

MySQL会使用索引快速定位user_id=100的数据所在的页,大大提高了查询效率。


5.2 页的分裂与合并

当数据不断插入时,页可能会被填满。此时,MySQL会进行页分裂,将一部分数据移动到新页中。相反,当数据被删除时,MySQL可能会进行页合并,将多个半满的页合并成一个页。

案例:页的分裂

假设一个页只能存储4条记录,当前页中有以下数据:

[1, 'Alice'], [2, 'Bob'], [3, 'Charlie'], [4, 'David']

当我们插入第5条记录时:

INSERT INTO users (id, name) VALUES (5, 'Eve');

MySQL会将该页分裂成两个页:

页1: [1, 'Alice'], [2, 'Bob']
页2: [3, 'Charlie'], [4, 'David'], [5, 'Eve']

6. 总结

  • 页是MySQL存储的最小单位,大小为16KB,所有的数据都以页的形式存储在磁盘上。
  • 数据存取过程包括查找索引、读取页、返回数据等步骤。
  • 缓冲池是MySQL优化性能的重要机制,它缓存了磁盘上的页,减少了磁盘I/O。
  • 不同存储引擎(如InnoDB和MyISAM)在数据存取过程中有一些区别:
    • InnoDB使用聚簇索引,数据和索引存储在一起,支持事务。
    • MyISAM将数据和索引分开存储,查询速度较快,但不支持事务。
  • 索引页的分裂与合并是MySQL优化数据存取的关键技术。

希望通过本文的讲解,你能对MySQL的存储最小单位及数据存取过程有更深入的理解,并能在实际开发中灵活运用这些知识!


http://www.kler.cn/a/577695.html

相关文章:

  • Tomcat快速入门指南
  • 基于SSM+MySQL实现个人博客网站
  • 004-获取CPU占用率
  • AI壁纸进阶宝典:让创作效率与质量飞速提升的法门
  • vLLM 部署大语言模型的系统选择策略
  • 动态算术优化算法Dynamic Arithmetic Optimization Algorithm (DAOA)、附完整代码
  • 数据库原理5
  • 系统功能:查询系统各角色数量
  • Visual studio + Qt 项目配置管理
  • 定制开发开源AI智能名片S2B2C商城小程序:以“晒”为桥,构建信任,助力社交新零售飞跃
  • 1688按图搜索商品(拍立淘)API返回的数据结构
  • WHAT - Tree Shaking 的前提是 ES Module
  • ubuntu 22.04附加驱动安装NVIDIA显卡驱动重启后无WiFi蓝牙等问题
  • Django 中,Form 和 ModelForm的用法和区别
  • Facebook 的历史与发展:从校园网站到全球社交平台
  • AIP-161 域掩码
  • Matlab中lfilter函数
  • 【空地协同技术教程:概念与技术手段解析】
  • elasticsearch商业产品
  • 使用vue3.0+electron搭建桌面应用并打包exe