五月15

MySQL
count(1) count(*) count(列名): InnoDB 引擎中,COUNT(1) 和 COUNT(*) 没有区别,都是⽤来统计所有⾏,包括 NULL。 如果表有索引,count(*)会走索引统计,count(1)也会被优化为count(*)。count(列名) 会统计列名非null的部分。

SQL 语句执行顺序:先执⾏ FROM 确定主表(ON 确定表连接条件),再执⾏ JOIN 连接,然后 WHERE 进⾏过滤,接着 GROUP BY 进⾏分组,HAVING 过滤聚合结果,SELECT 选择最终列(DISTINCT 去重),ORDER BY 排序,最后 LIMIT 限制返回⾏数。WHERE 先执⾏是为了减少数据量,HAVING 只能过滤聚合数据,ORDER BY 必须在 SELECT 之后排序最终结果,LIMIT 最后执⾏以减少数据传输。

3-8 行数据查询

1
select * from a limit 2,8;

隐式类型转换:整数和浮点数相加时,整数会被转换为浮点数。个字符串和⼀个整数相加时,字符串会被转换为整数。

SQL 语法树解析:SQL 语法树解析是将 SQL 查询语句转换成抽象语法树 —— AST 的过程,是数据库引擎处理查询的第⼀步,也是防
⽌ SQL 注⼊的重要⼿段。
通常分为 3 个阶段。
第⼀个阶段,词法分析:拆解 SQL 语句,识别关键字、表名、列名等。第⼆个阶段,语法分析:检查 SQL 是否符合语法规则,并构建抽象语法树。第三个阶段,语义分析:检查表、列是否存在,进⾏权限验证等。
SQL 语句执行流程:客户端向服务端发送查询语句;MySQL 服务器连接器开始进行连接;解析器解析SQL语句;优化器负责决定执行计划;优化器调用存储引擎API进行读写;存储引擎查询数据,返回结果。
update 语句执行流程:事务开始前,记录undo log用于事务回滚,存储引擎将更新操作写入redo log 用于故障恢复。写完redo log后,获取行锁修改数据标记脏页,此时还在buffer pool中;提交事务,redo log 中记录标记为committed,释放行锁。

基础架构:①、连接层主要负责客户端连接的管理,包括验证⽤户身份、权限校验、连接管理等。可以通过数据库连接池来提
升连接的处理效率。
②、服务层是 MySQL 的核⼼,主要负责查询解析、优化、执⾏等操作。在这⼀层,SQL 语句会经过解析、优化器
优化,然后转发到存储引擎执⾏,并返回结果。这⼀层包含查询解析器、优化器、执⾏计划⽣成器、⽇志模块等。
③、存储引擎层负责数据的实际存储和提取。MySQL ⽀持多种存储引擎,如 InnoDB、MyISAM、Memory 等。
binlog 在服务层,负责记录 SQL 语句的变化。它记录了所有对数据库进⾏更改的操作,⽤于数据恢复、主从复制
等。

MySQL 段页区行

存储引擎:InnoDB、MyISAM、memory 差异:InnoDB 支持事务、支持行锁、支持外键;二者索引均使用B+索引,InnoDB 中只记录实际数据,MyIsAM 存储数据的地址值,从而导致二者的文件存储方式不同。MyISAM 适用于读多写少的场景、memory适合临时表、数据量较小的情景。InnoDB 内存区域主要为 buffer pool 和 log pool;buffer pool 用于缓存数据页和索引页;log pool 用于缓存redo log。
数据页结构:由 7 部分组成,其中⽂件头、⻚头和⽂件尾的⼤⼩是固定的,分别为 38、56 和 8 个字节,⽤来标记该⻚的⼀些信息。⾏记录、空闲空间和⻚⽬录的⼤⼩是动态的,为实际的⾏记录存储空间。
Buffer pool 将经常使⽤的数据⻚、索引⻚加载进内存,读的时候先查询 Buffer Pool,如果命中就不⽤访问磁盘了。如果没有命中,就从磁盘读取,并加载到 Buffer Pool,此时可能会触发⻚淘汰,将不常⽤的⻚移出 Buffer Pool。写操作时不会直接写⼊磁盘,⽽是先修改内存中的⻚,此时⻚被标记为脏⻚,后台线程会定期将脏⻚刷新到磁盘。默认⼤⼩是 128MB。
InnoDB 对 LRU 算法的优化:最近访问的数据并不直接放到 LRU 链表的头部,⽽是放在⼀个叫
midpoiont 的位置。默认情况下,midpoint 位于 LRU 列表的 5/8 处。当⻚数据被频繁访问后,再将其移动到 young 区,这样做的好处是热点⻚能⻓时间保留在内存中,不容易被挤出去。

日志
MySQL 中常见的日志:错误日志、慢查询日志、一般查询日志、二进制日志、undo log 与MVCC配合,实现原子性与回滚;redo log 保障数据持久性(物理级别);binlog 主从复制和数据恢复。
binlog 记录磁盘在数据库所有操作。binlog 有三种格式:Statement、Row 和 Mixed,分别对应 SQL 语句级别、⾏级别和混合级别,默认为⾏级别。默认不启用。启用配置:log_bin = mysql-bin
sync_binlog=0 ,设置每多少次 binlog 写操作会触发⼀次磁盘同步操作。默认值为 0,表示 MySQL 不会主动触发同步操作,⽽是依赖操作系统的磁盘缓存策略。即当执⾏写操作时,数据会先写⼊缓存,当缓存区满了再由操作系统将数据⼀次性刷⼊磁盘。如果设置为 1,表示每次 binlog 写操作后都会同步到磁盘,虽然可以保证数据能够及时写⼊磁盘,但会降低性能。
有了binlog为什么还要undolog redolog? binlog 是物理日志,属于server层,与存储引擎无关,无法操作数据。redo log 和 undo log 是 InnoDB 存储引擎实现 ACID 的基⽯。binlog 关注的是逻辑变更的全局记录;redo log ⽤于确保物理变更的持久性,确保事务最终能够刷盘成功;undo
log 是逻辑逆向操作⽇志,记录的是旧值,⽅便恢复到事务开始前的状态。
Redo log 工作:事务启动时,为该事务分配唯一的标识符,事务执行中,每次修改生成一条redo log,记录前后状态。redo log 先写入缓存池,事务提交时写入redolog 文件。崩溃重启时,先检查redolog 对于已提交的事务,重放redolog 记录;对未提交的事务,使用undolog进行回滚。redolog循环写大小固定环形写入,新数据会覆盖旧数据。避免覆盖未持久化的记录,MySQL 会定期执⾏ CheckPoint 操作,将内存中的数据⻚刷新到磁盘,并记录 CheckPoint 点。重启时,MySQL 只会重放 CheckPoint 之后的 Redo Log。
binlog 与 redo log:binlog是逻辑日志,redo log 是物理日志记录数据页的具体修改

WAL 先写⽇志再刷磁盘。修改数据⻚之前,先将修改记录写⼊ Redo Log。这样的话,即使数据⻚尚未写⼊磁盘,系统崩溃时也能通过 Redo Log 恢复数据。数据落盘由后台处理,提升效率。

拱卒(20min)电话面试:权限模型、用户注册接口防刷、单点登录使用jwt进行踢人下线、is else优化、权限模型、数据库表一对一、一对多、多对多。接口抽象类、策略模式的应用。
递拓维信息的Python工程师(AI应用方向):Python 相关内容笔试,20 选择题,不会。
面经:说说垃圾回收。

3.可达性分析法怎么实现的,根节点有哪些,让你自己实现你怎么做

4.垃圾回收期间发生的动态变化怎么处理,比如一个对象之前是垃圾,现在不是了,会不会回收。

5.哪种gc会发生stop the world

6.说说aqs原理(简历里写的,不写应该不会直接问)。

7.java有哪些引用类型

8.由4引出了ThreadLocalMap的提问,为什么Key是弱引用。

9.ACID是什么,在Innodb怎么实现的。

10.redolog满了怎么办。——文件组循环清除——追问:什么时候清除清除的是哪些数据?

11.是事务执行过程中边写redolog边写数据,还是commit的时候写redolog,先写数据还是先写redolog?

12.说说索引。

13.实习和项目问答

14.算法题:前序中序生成二叉树。

作者:小盲陀
链接:https://www.nowcoder.com/
来源:牛客网


五月15
http://bloomivy.github.io/2025/05/15/五月15/
作者
Bloom
发布于
2025年5月15日
许可协议