八股学习(五)---MySQL

一、请详细描述MySQL的B+树中查询数据的全过程

我的回答:

首先,从根节点开始,用二分法比较要查询的数据键值与索引键值来确定数据落在哪个区间,从而确定分支,一直找到子节点为止,而子节点中数据行以组的形式划分。利用页目录的结构,通过二分查找找到对应的组,再在组内遍历链表,从而找到想要的数据行。

豆包回答:

从 B + 树根节点开始,通过二分查找确定目标键值所在的子节点指针,逐层向下定位,直到叶子节点。叶子节点通过双向链表连接,找到目标键值后,聚簇索引直接获取数据,非聚簇索引则通过主键回表查询完整数据。

回答重点(官方答案):

回答重点

1)数据从根节点找起,根据比较数据键值与节点中存储的索引键值(用了二分),确定数据落在哪个区间,从而确定分支,从上到下最终定位到叶子节点

2)叶子节点存储实际的数据行记录,但是一页有 16KB 大小,存储的数据行不止一条

3)叶子节点中数据行以组的形式划分,利用页目录结构,通过二分查找可以定位到对应的组

4)定位组后,利用链表遍历就可以找到对应的数据行

知识扩展

二、MySQL 中 count (*)、count (1) 和 count (字段名) 有什么区别?

我的回答:

功能上:

count (*)是统计表中有多少行,包括null值。这也是我常用的,而count (1)和count(*)几乎是一样的,包括性能上也是没有差别的。至于count(字段名)是统计字段不为null的行数。

豆包回答:

  • count(*):统计所有行数(包括 NULL),InnoDB 会扫聚簇索引,MyISAM 直接读总数。
  • count(1):和count(*)逻辑几乎一致,性能无差别。
  • count(字段名):只统计该字段非 NULL 的行数,若字段有索引会更快。

回答重点(官方答案):

在 MySQL 中,count (*) 、 count (1) 和 count (字段名) 都是用来统计行数的聚合函数,但它们有些许的区别:

功能上:

1)count(*) 会统计表中所有行的数量,包括 null 值(不会忽略任何一行数据)。由于只是计算行数,不需要对具体的列进行处理,因此性能通常较高。
2)count (1) 和 count (*
) 几乎没差别,也会统计表中所有行的数量,包括 null 值。

3)count (字段名) 会统计指定字段不为 null 的行数。这种写法会对指定的字段进行计数,只会统计字段值不为 null 的行。

效率上:

1)count (1) 和 count (*) 效率一致,没有差异。
2)count (字段) 的查询就是全表扫描 (如果对应的字段没有索引,如果有索引则用索引),正常情况下它还需要判断字段是否是 null,因此理论上会比 count (1) 和 count (*
) 慢。

但是如果字段不为 null,例如是主键,那么理论上也差不多,而且本质上它们的统计功能不一样,

在需要统计 null 的时候,只能用 count (1) 和 count (*) ,不需要统计 null 的时候只能用 count (字段) ,所以也不用太纠结性能问题。

扩展知识

三、MySQL 中 varchar 和 char 有什么区别?

我的回答:

char是固定长度,读写快,但可能浪费空间,适合存储长度固定的字符串

varchar是可变长度,按实际内容长度存储,节省空间但是读写较慢,适合存储长度不固定的字符串,比如姓名,文本

豆包回答:

  • char:固定长度,存满指定长度(不足补空格),读写快但可能浪费空间,适合长度固定的场景(如手机号)。
  • varchar:可变长度,按实际内容长度存储,省空间但读写稍慢,适合长度不固定的场景(如姓名)。

回答重点(官方答案):

CHAR 和 VARCHAR 是两种用于存储字符串的列类型,它俩最大的不同就是一个是固定长度,一个是可变长度。

  • CHAR (n):固定长度的字符串。CHAR 列的长度是固定的,即使存储的字符串长度小于定义的长度,MySQL 也会在字符串的末尾填充空格以达到指定长度(如果 char 类型的字符串后面有空格的话,innodb 会忽略)。
  • VARCHAR (n):可变长度的字符串。VARCHAR 列的长度是可变的,存储的字符串长度与实际数据长度相等,并且在存储数据时会额外增加 1 到 2 个字节(字符长度超过 255,则使用两个字节)用于存储字符串的长度信息。

理论上来说 CHAR 会比 VARCHAR 快,因为 VARCHAR 长度不固定,处理需要多一次运算,但是实际上这种运算耗时微乎其微,而固定大小在很多场景下比较浪费空间,除非存储的字符确认是固定大小或者本身就很短,不然业务上推荐使用 VARCHAR。

相关推荐
西岸行者7 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意7 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码7 天前
嵌入式学习路线
学习
毛小茛8 天前
计算机系统概论——校验码
学习
babe小鑫8 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms8 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下8 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。8 天前
2026.2.25监控学习
学习
im_AMBER8 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J8 天前
从“Hello World“ 开始 C++
c语言·c++·学习