八股学习(五)---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。

相关推荐
peace..22 分钟前
温湿度变送器与电脑进行485通讯连接并显示在触摸屏中(mcgs)
经验分享·学习·其他
软件黑马王子1 小时前
C#系统学习第八章——字符串
开发语言·学习·c#
strongwyy3 小时前
蓝牙墨水屏上位机学习(2)
学习
九皇叔叔3 小时前
(3)手摸手-学习 Vue3 之 变量声明【ref 和 reactive】区别
学习
The_cute_cat6 小时前
Ajax和Axios的初步学习
前端·学习·ajax
amazinging6 小时前
北京-4年功能测试2年空窗-报培训班学测开-第四十三天
python·学习
虾球xz7 小时前
CppCon 2018 学习:THE MOST VALUABLE VALUES
开发语言·c++·学习
丰锋ff8 小时前
计网学习笔记第2章 物理层(灰灰题库)
笔记·学习
Chef_Chen9 小时前
从0开始学习R语言--Day39--Spearman 秩相关
开发语言·学习·r语言