MySQL底层数据结构详解

一、B+树索引

1、B+树是一种平衡树,它是一种多路查找树,每个节点可以存储多个索引值和相应数据的地址。MySQL使用B+树作为索引结构,B+树的优势在于磁盘I/O瓶颈的优化,它的每个非叶子节点都存储有下一层叶子节点的地址,可以按照层级进行I/O优化。

2、B+树在MySQL中的实现采用了InnoDB存储引擎,它的B+树索引结构中,在非叶子节点存储的是索引值,数据都记录在叶子节点,可以通过叶子节点的链表进行顺序扫描查询。叶子节点的数据存储按照主键的顺序存储,所以在进行范围查询时,可以通过顺序扫描最小值和最大值之间的叶子节点进行查询。

示例代码:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

二、聚簇索引

1、聚簇索引是一种特殊的索引,它与数据行存储在一起,即索引和数据在同一个物理区域内存储。从而在使用聚簇索引进行主键查询时,可以减少I/O的次数,提高查询效率,并且避免了非聚簇索引的回表操作。

2、在MySQL中,InnoDB存储引擎默认采用的就是聚簇索引,所以在进行主键查询时,可以通过B+树索引直接定位到数据行所在的物理地址,从而避免了回表操作。

示例代码:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

三、自适应哈希索引

1、自适应哈希索引是一种动态调整的索引结构,它可以根据数据的读取频率自动调整哈希索引表的大小,并且可以根据数据的访问情况进行动态的哈希函数调整。在数据分布不均匀的情况下,自适应哈希索引比B+树索引具有更好的查询性能。

2、在MySQL中,自适应哈希索引被用于InnoDB存储引擎中,用于加速缓存中的数据查询。它在缓存中可以替代B+树索引的一部分功能,从而减少B+树的节点数,提高查询效率。

示例代码:

ALTER TABLE `users` ADD PRIMARY KEY USING HASH (id);

四、页式存储结构

1、页式存储结构是指MySQL的数据存储结构是按照页为单位进行管理,每个页的大小是固定的。在InnoDB存储引擎中,每个页的大小默认为16KB,而MyISAM存储引擎中每个页的大小默认为1KB。

2、MySQL在存储记录时,使用了基于B+树的页式存储结构,通过将数据按照页的大小划分成多个块,分别存储在不同的页内,从而提高数据存储和查询的效率。同时,MySQL在管理页的使用中也采用了缓存机制,常用的页会被缓存到内存中,从而减少I/O次数。

示例代码:

ALTER TABLE `users` ENGINE=InnoDB;

五、undo日志和redo日志

1、undo日志是在事务执行过程中记录数据修改前的状态的日志文件,在事务回滚时可以用来还原修改前的状态,以保证数据的一致性。

2、redo日志是记录数据修改后的状态的日志文件,在MySQL的InnoDB存储引擎中,redo日志的作用是在崩溃恢复或者主从复制的过程中,恢复数据的一致性。

示例代码:

1、开启undo日志

SET GLOBAL innodb_undo_logs=4;
SET GLOBAL innodb_undo_tablespaces=2;

2、开启redo日志

SET GLOBAL innodb_flush_log_at_trx_commit=1;
SET GLOBAL innodb_file_per_table=1;

原创文章,作者:PZCZP,如若转载,请注明出处:https://www.506064.com/n/370164.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PZCZPPZCZP
上一篇 2025-04-18 13:40
下一篇 2025-04-18 13:40

相关推荐

  • 如何修改mysql的端口号

    本文将介绍如何修改mysql的端口号,方便开发者根据实际需求配置对应端口号。 一、为什么需要修改mysql端口号 默认情况下,mysql使用的端口号是3306。在某些情况下,我们需…

    编程 2025-04-29
  • 数据结构与算法基础青岛大学PPT解析

    本文将从多个方面对数据结构与算法基础青岛大学PPT进行详细的阐述,包括数据类型、集合类型、排序算法、字符串匹配和动态规划等内容。通过对这些内容的解析,读者可以更好地了解数据结构与算…

    编程 2025-04-29
  • Python操作MySQL

    本文将从以下几个方面对Python操作MySQL进行详细阐述: 一、连接MySQL数据库 在使用Python操作MySQL之前,我们需要先连接MySQL数据库。在Python中,我…

    编程 2025-04-29
  • 数据结构学生成绩管理系统

    在现代教育中,学生成绩的管理已经成为了一个不可或缺的部分。借助数据结构,一个高效、可靠的学生成绩管理系统可以被轻松实现。 一、数据结构的选择 在构建学生成绩管理系统时,选择合适的数…

    编程 2025-04-29
  • MySQL递归函数的用法

    本文将从多个方面对MySQL递归函数的用法做详细的阐述,包括函数的定义、使用方法、示例及注意事项。 一、递归函数的定义 递归函数是指在函数内部调用自身的函数。MySQL提供了CRE…

    编程 2025-04-29
  • MySQL bigint与long的区别

    本文将从数据类型定义、存储空间、数据范围、计算效率、应用场景五个方面详细阐述MySQL bigint与long的区别。 一、数据类型定义 bigint在MySQL中是一种有符号的整…

    编程 2025-04-28
  • MySQL左连接索引不生效问题解决

    在MySQL数据库中,经常会使用左连接查询操作,但是左连接查询中索引不生效的情况也比较常见。本文将从多个方面探讨MySQL左连接索引不生效问题,并给出相应的解决方法。 一、索引的作…

    编程 2025-04-28
  • CentOS 7在线安装MySQL 8

    在本文中,我们将介绍如何在CentOS 7操作系统中在线安装MySQL 8。我们会从安装环境的准备开始,到安装MySQL 8的过程进行详细的阐述。 一、环境准备 在进行MySQL …

    编程 2025-04-27
  • 如何使用MySQL字段去重

    本文将从多个方面为您详细介绍如何使用MySQL字段去重并给出相应的代码示例。 一、SELECT DISTINCT语句去重 MySQL提供了SELECT DISTINCT语句,通过在…

    编程 2025-04-27
  • MySQL正则表达式替换

    MySQL正则表达式替换是指通过正则表达式对MySQL中的字符串进行替换。在文本处理方面,正则表达式是一种强大的工具,可以方便快捷地进行字符串处理和匹配。在MySQL中,可以使用正…

    编程 2025-04-27

发表回复

登录后才能评论