MySQL中关于B+树的一道面试题,99%的候选人回答错误!

MySQL中关于B+树的一道面试题,99%的候选人回答错误!,第1张

问题:MySQL的索引B+树叶子节点上的数据记录是通过单向链表还是双向链表组织起来的?

本文的观点是基于MySQL使用Innodb存储引擎的情况下进行的! 很多渠道说:MySQL数据按照主键大小依次排列,记录之间是双向链表连起来。如果说我告诉你这种说法很大程度上是错的,你肯定说我在胡扯。

我们先看看MySQL的B+树索引结构是什么样的

是的,这种图和网上的很多图都是类似的,我们可以看到每个节点上会有多个记录或者数据,MySQL使用Innob引擎时,这个节点就代表的是Innodb页,Innodb页是最小的存储单元。

通过上图或者你以前就知道,一个Innodb页存储很多条数据。 但是Innodb页可不只有数据记录,还会有其他数据

同样每条记录也不单单只有数据本身,还包含其他额外的数据,我的上篇文章有这么一幅图

其中额外信息中,有记录头信息部分,这部分到底长什么样呢

记录头占 5 个字节,40 位,下图是对应代表的含义

这里我们着重看一下下条记录的相对位置部分: 什么是相对位置呢?简要回答就是我离你有多远,而不是起点离你有多远。 放在MySQL里代表记录之间的距离。

下面我们借助另一张图看一下,看一下Innodb页中记录之间是怎么存储的

上图中我们看到,记录之间是亲密无间的排列的。 那我们怎么找下一条记录呢,还是看上面的出现的一张图,里面的下条记录的相对位置

比如,记录1的中下条记录的相对位置为38,意味着从记录1的真实数据开始往后找38个字节就是下一条记录的真实数据的开始。如果记录1的下条记录的相对位置是-38,代表从记录1的真实数据部分往前找38个字节就是下一条记录的真实数据部分。

如果你了解数据结构,你一定明白,这特么就是链表啊! 是的,Innodb页中的数据之间,是通过单向链表来实现的。

但是,Innodb页之间是双向链表关联的。

一个Innodb页中的文件头中有这么两个属性:上一页的页号、下一页的页号

所以MySQL叶子节点之间是通过双向链表完成的。

Mysql中记录间既有单向链表,又有双向链表!

mysql被设计成了一个单进程多线程架构的数据库

开始:

1、默认的InnoDB存储引擎的后台线程有7个,4个IO thread ,1个master thread 1个锁监控 thread 1个错误监控thread,IO thread 的数量由配置文件的innodb_file_io_threads参数控制,默认是4,linux下面不可以调整,但是window下面可以

show engine innodb status \G(root用户,或者你的用户有查看权限)

show variables like 'innodb_version' \G

show variables like 'innodb_%io_threads' \G

注释:我十分建议大家安装独立的mysql,不要用集成环境,因为出现问题会后悔死的

2、innodb存储引擎内存有以下部分:

buffer pool 缓冲池

redo log buffer 重做日志缓冲池

additional memory pool 额外内存池

配置文件的innodb:

# Comment the following if you are using InnoDB tables

#skip-innodb

innodb_data_home_dir = "D:/xampp/mysql/data"

innodb_data_file_path = ibdata1:10M:autoextend

innodb_log_group_home_dir = "D:/xampp/mysql/data"

#innodb_log_arch_dir = "D:/xampp/mysql/data"

## You can set .._buffer_pool_size up to 50 - 80 %

## of RAM but beware of setting memory usage too high

innodb_buffer_pool_size = 16M

innodb_additional_mem_pool_size = 2M

## Set .._log_file_size to 25 % of buffer pool size

innodb_log_file_size = 5M

innodb_log_buffer_size = 8M

innodb_flush_log_at_trx_commit = 1

innodb_lock_wait_timeout = 50

这是my.ini的配置,更多的InnoDB的配置,可以看my_innodb_heavy_4G.ini

注释:配置文件的值可能会根据不同的环境更改,上面的配置文件是在我安装之后默认的

3、缓冲池是用来存放各种数据的缓存,InnoDB存储引擎的工作方式是将数据库文件按页(每页16K)读取到缓冲池,然后按照最近最少使用(LRU)的算法保留在缓冲池中的缓存数据

输入:show engine innodb status\G


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7490255.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存