您的位置:

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;