ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

计算机大厂工作实习--02 八股必背(题目答案版)

计算机大厂工作实习--02 八股必背(题目答案版)

文章目录

  • 计算机网络
    • 1. 从输入 URL 到页面展示发生了什么?
    • 2. 三次握手的过程,以及为什么是三次,而不是四次,两次?
    • 3. 四次挥手的过程,以及为什么是四次?
    • 4. TCP 与 UDP 的概念、特点、区别和对应的使用场景?
    • 5. HTTP 常见的状态码和常见字段有哪些?
    • 6. HTTP 有哪些请求方法?GET 和 POST 请求的区别是什么?
    • 7. 什么是强缓存和协商缓存?
    • 8. HTTP 1.0 和 HTTP 1.1 的区别?
    • 9. HTTP 2.0 与 HTTP 1.1 的区别?
    • 10. HTTPS 是怎么建立连接的?
    • 11. HTTPS 与 HTTP 的区别?
    • 12. DNS 是什么?DNS 查询过程是什么?
    • 13. HTTP 多个 TCP 连接是如何实现的?
    • 14. TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗?
    • 15. TCP 连接如何确保可靠性?
    • 16. 既然提到了拥塞控制,那你能说说拥塞控制是怎么实现的吗?
    • 17. Cookie 和 Session 是什么?有什么区别?
    • 18. Ping 是怎么工作的?
    • 19. 什么是 SYN 攻击?如何避免?
    • 20. 什么是对称加密和非对称加密?
    • 21. HTTPS 是如何保证数据完整性的?
    • 22. 数字证书验证流程是什么?
  • 操作系统
    • 1. 进程和线程的区别?
    • 2. 进程调度算法你了解多少?
    • 3. 进程间有哪些通信方式?
    • 4. 什么是死锁?如何避免死锁?
    • 5. 什么是虚拟内存?为什么需要虚拟内存?
    • 6. 什么是内存分段和分页?它们的作用是什么?
    • 7. 解释一下用户态和内核态?
    • 8. 解释一下页面置换算法,例如 LRU(最近最少使用)、FIFO(先进先出)等?
    • 9. 解释一下进程同步和互斥,以及解决这些问题的方法?
    • 10. 什么是中断和异常?它们有什么区别?
    • 11. 介绍一下几种典型的锁?
    • 12. 你知道的线程同步方式有哪些?
  • 数据库
    • 1. 一条 SQL 查询语句是如何执行的?
    • 2. 说一说事务隔离级别?
    • 3. 事务的四大特性有哪些?
    • 4. 索引有哪些种类?
    • 5. MySQL 为什么使用 B+ 树作为索引?它的优势是什么?
    • 6. 什么时候需要创建索引?什么时候不需要创建索引?
    • 7. 说一下你了解的 MVCC 机制,并说明原理?
    • 8. 索引失效的场景有哪些?
    • 9. MySQL 的执行引擎有哪些?
    • 10. MySQL 日志文件有哪几种?有什么作用?
    • 11. MySQL 有哪些锁?作用分别是什么?
  • Redis
    • 1. Redis 为什么这么快?
    • 2. Redis 的数据类型有哪些?
    • 3. 说一说 Redis 持久化机制?
    • 4. Redis 过期键的删除策略?
    • 5. 什么是缓存击穿、缓存穿透、缓存雪崩?
    • 6. 如何保证缓存和数据库双写时的一致性?
    • 7. Redis 是单线程的还是多线程的?
    • 8. Redis 事务的相关命令有哪些?
    • 9. Redis 事务支持隔离性吗?为什么不支持回滚?
    • 10. 介绍一下 Redis 的哨兵机制?
    • 11. Redis 哨兵是如何工作的?
    • 12. 了解主从复制的原理吗?

说明:计算机网络,操作系统、数据库的详细答案直接看文档。

计算机网络

1. 从输入 URL 到页面展示发生了什么?

① 浏览器解析 URL,检查本地缓存,并通过 DNS 将域名解析成服务器 IP。

② 浏览器与服务器建立 TCP 连接;如果是 HTTPS,还需要进行 TLS 握手。

③ 浏览器发送 HTTP 请求,服务器处理业务逻辑并返回 HTTP 响应。

④ 浏览器解析 HTML 生成 DOM 树,解析 CSS 生成 CSSOM 树,同时下载并执行 JavaScript。

⑤ DOM 和 CSSOM 结合生成渲染树,经过布局、绘制和图层合成,最终将页面展示出来。

面试时可以概括为:

URL 解析 → 缓存 → DNS → TCP/TLS → HTTP 请求与响应 → DOM/CSSOM → 渲染树 → 布局 → 绘制 → 页面展示。

2. 三次握手的过程,以及为什么是三次,而不是四次,两次?

① 第一次握手:客户端发送 SYN,请求建立连接,并发送自己的初始序列号。

② 第二次握手:服务器返回 SYN + ACK,确认客户端的请求,同时发送自己的初始序列号。

③ 第三次握手:客户端返回 ACK,确认收到了服务器的序列号,双方建立连接。

④ 不能两次,是因为服务器无法确认客户端是否收到了自己的响应,也无法避免失效的历史连接请求造成资源浪费。

⑤ 不需要四次,是因为服务器的确认报文 ACK 和连接请求报文 SYN 可以合并发送。

最核心的一句话是:

三次握手是为了确认双方的收发能力正常,并同步和确认双方的初始序列号;两次不够可靠,四次又可以合并为三次。

3. 四次挥手的过程,以及为什么是四次?

① 第一次挥手:主动关闭方发送 FIN,表示自己没有数据要发送了。

② 第二次挥手:被动关闭方返回 ACK,但此时可能还有数据需要继续发送。

③ 第三次挥手:被动关闭方发送完剩余数据后,再发送 FIN。

④ 第四次挥手:主动关闭方返回 ACK,并进入 TIME_WAIT,等待 2MSL 后关闭。

⑤ 之所以需要四次,是因为 TCP 是全双工通信,两个方向需要分别关闭;服务器收到 FIN 后,ACK 可以立即发送,但 FIN 需要等剩余数据发送完成后才能发送。

最核心的一句话:

TCP 是全双工通信,双方的发送方向需要分别关闭,所以通常需要四次挥手。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ebc1e2fea7cb423ca46d1aed1f5707a9.png

4. TCP 与 UDP 的概念、特点、区别和对应的使用场景?

① TCP 是面向连接、可靠、基于字节流的传输协议,通过确认应答、超时重传、流量控制和拥塞控制保证数据可靠、有序到达。

② UDP 是无连接、不保证可靠、面向数据报的传输协议,不提供确认和重传机制,因此开销更小、传输速度更快。

③ TCP 适用于网页访问、文件传输、支付和数据库连接等对可靠性要求高的场景;UDP 适用于音视频通话、直播、游戏和 DNS 等对实时性要求高的场景。

④ 两者最核心的区别是:

TCP 更注重可靠性,UDP 更注重实时性和传输效率。

5. HTTP 常见的状态码和常见字段有哪些?

① 状态码主要分为五类:1xx 信息响应、2xx 成功、3xx 重定向、4xx 客户端错误、5xx 服务器错误。

② 常见状态码有:200 成功、201 创建成功、301/302 重定向、304 使用缓存、400 参数错误、401 未认证、403 无权限、404 资源不存在、429 请求过多、500 服务器错误、502 网关错误、503 服务不可用、504 网关超时。

③ 常见请求字段有 Host、User-Agent、Accept、Content-Type、Authorization、Cookie、Origin 和 Referer;常见响应字段有 Content-Type、Set-Cookie、Location、Cache-Control、ETag 和 Last-Modified。

6. HTTP 有哪些请求方法?GET 和 POST 请求的区别是什么?

常见的请求方式:
① GET:获取资源
例如:查询用户信息、获取文章列表。

② POST:创建资源或提交数据
例如:注册用户、提交订单、上传文件。

③ PUT:整体更新资源
例如:更新用户的全部信息。

④ PATCH:局部更新资源
例如:只修改用户的昵称。

⑤ DELETE:删除资源
例如:删除用户、删除文章。

Q2:
GET 主要用于查询数据,参数通常放在 URL 中,可以被缓存和保存为书签,并且通常具有幂等性;POST 主要用于提交或新增数据,参数通常放在请求体中,可以传输更多数据,默认不缓存,而且通常不具有幂等性。

需要注意:GET 并不是因为参数在 URL 中就一定不安全,POST 也不是天然安全。真正的数据传输安全需要依靠 HTTPS、鉴权和权限控制。

7. 什么是强缓存和协商缓存?

先了解一下浏览器缓存流程 :

浏览器请求资源
↓
检查强缓存是否有效
↓
有效:直接使用本地缓存
↓
无效:发送协商缓存请求
↓
资源未修改:服务器返回 304,使用本地缓存
↓
资源已修改:服务器返回 200 和最新资源

精简回答:

① 强缓存命中时,浏览器不会向服务器发送请求,直接读取本地缓存,主要由 Cache-Control 和 Expires 控制。

② 协商缓存会向服务器发送请求,通过 ETag / If-None-Match 或 Last-Modified / If-Modified-Since 判断资源是否发生变化。资源未变化返回 304,发生变化返回 200 和最新资源。

③ 一般先判断强缓存,强缓存失效后再使用协商缓存。

8. HTTP 1.0 和 HTTP 1.1 的区别?

① HTTP 1.0 默认使用短连接,每次请求都要重新建立 TCP 连接;HTTP 1.1 默认使用长连接,可以复用 TCP 连接。

② HTTP 1.1 强制要求携带 Host 请求头,支持一台服务器部署多个虚拟主机。

③ HTTP 1.1 增加了管道化、分块传输和范围请求,支持断点续传。

④ HTTP 1.1 的缓存机制更加完善,增加了 Cache-Control、ETag 等字段。

最核心的区别可以记为:长连接、Host、缓存增强、分块传输和断点续传。

9. HTTP 2.0 与 HTTP 1.1 的区别?

① HTTP/2 使用二进制分帧,而 HTTP/1.1 使用文本报文。

② HTTP/2 支持多路复用,可以在一个 TCP 连接中并发传输多个请求和响应,减少连接建立开销,并解决 HTTP 层面的队头阻塞。

③ HTTP/2 使用 HPACK 压缩请求头,减少重复头部数据。

④ HTTP/2 还支持请求优先级和服务器推送。

⑤ HTTP/2 仍然基于 TCP,因此发生丢包时,仍然存在 TCP 层面的队头阻塞。

最核心的一句话:

HTTP/2 通过二进制分帧、多路复用和头部压缩,提高了 HTTP/1.1 的传输效率,但没有解决 TCP 层面的队头阻塞。

10. HTTPS 是怎么建立连接的?

HTTPS=HTTP+TLS

① 客户端先通过 TCP 三次握手与服务器建立连接。

② 客户端发送 ClientHello,服务器返回 ServerHello、数字证书和密钥交换参数。

③ 客户端验证证书的有效期、域名、签名和 CA 是否可信。

④ 验证通过后,双方通过 ECDHE 等算法协商出相同的会话密钥。

⑤ TLS 握手完成后,双方使用对称加密传输 HTTP 数据。

最核心的一句话:

HTTPS 先通过证书验证服务器身份,再通过密钥交换协商会话密钥,最后使用对称加密传输 HTTP 数据。

11. HTTPS 与 HTTP 的区别?

HTTPS = HTTP + TLS

HTTP 负责传输应用层数据,TLS 负责加密、身份认证和完整性校验。

① HTTP 默认使用 80 端口,数据通常明文传输;HTTPS 默认使用 443 端口,是在 HTTP 基础上增加 TLS 加密。

② HTTPS 通过数字证书验证服务器身份,通过加密保证数据机密性,并通过完整性校验防止数据被篡改。

③ HTTP 建立 TCP 连接后即可传输数据;HTTPS 在 TCP 握手后还需要进行 TLS 握手,因此会有一定性能开销。

④ 最核心的区别是:

HTTP 是明文传输,HTTPS 提供加密、身份认证和数据完整性保护。

12. DNS 是什么?DNS 查询过程是什么?

① DNS 是域名系统,主要负责将域名解析为 IP 地址。

② 查询时先检查浏览器缓存、操作系统缓存和 hosts 文件;没有结果则请求本地 DNS 服务器。

③ 本地 DNS 缓存未命中时,会依次查询根域名服务器、顶级域名服务器和权威 DNS 服务器,最终获得 IP 地址并返回给客户端。

④ 查询结果会根据 TTL 缓存,以减少后续查询开销。

⑤ DNS 通常使用 UDP 53 端口,响应较大、区域传送等情况会使用 TCP。

最核心的流程是:

浏览器缓存 → 系统缓存 → hosts → 本地 DNS → 根 DNS → 顶级域 DNS → 权威 DNS → 返回 IP。

13. HTTP 多个 TCP 连接是如何实现的?

HTTP 本身是应用层协议,TCP 是传输层协议。
所谓“HTTP 使用多个 TCP 连接”,本质上是:

浏览器为同一个网站同时创建多个 TCP Socket,每个 Socket 都可以独立发送 HTTP 请求、接收 HTTP 响应。

① HTTP 通过浏览器创建多个独立的 TCP Socket 来实现多个 TCP 连接,每个连接由源 IP、源端口、目标 IP、目标端口组成的四元组唯一标识。

② 即使访问同一个服务器,浏览器也可以使用不同的客户端临时端口建立多个连接,并将不同 HTTP 请求分配到这些连接中并行传输。

③ HTTP/1.1 通常使用连接池维护多个长连接,以提高资源加载速度,但连接数量会受到浏览器限制。

④ HTTP/2 通常不再依靠多个 TCP 连接,而是在一个 TCP 连接上通过多路复用并发传输多个请求。

最核心的一句话:

HTTP/1.1 通过多个不同源端口的 TCP 连接实现并发,HTTP/2 则主要通过单连接多路复用实现并发。

14. TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗?

① TCP Keepalive 和 HTTP Keep-Alive 不是一个东西。

② HTTP Keep-Alive 属于应用层,用于让多个 HTTP 请求复用同一个 TCP 连接,减少频繁握手和挥手的开销。

③ TCP Keepalive 属于传输层,用于连接长时间空闲时探测对端是否仍然存活,清理异常的半开连接。

④ 可以简单记为:

HTTP Keep-Alive 是为了复用连接,TCP Keepalive 是为了检测连接。

15. TCP 连接如何确保可靠性?

① TCP 通过序列号和确认应答机制,保证数据可确认、可排序,并识别重复数据。

② 当数据丢失时,通过超时重传和快速重传机制重新发送。

③ TCP 使用校验和检测数据是否在传输过程中损坏。

④ TCP 通过滑动窗口提高传输效率,并通过流量控制避免接收方缓冲区溢出。

⑤ TCP 通过拥塞控制根据网络状态调整发送速度,避免网络拥塞。

最核心的一句话:

TCP 通过序列号、ACK 确认、重传、校验和、滑动窗口、流量控制和拥塞控制,保证数据可靠、有序、无重复地传输。

16. 既然提到了拥塞控制,那你能说说拥塞控制是怎么实现的吗?

根据网络情况动态控制发送的速度。

① TCP 通过拥塞窗口 cwnd 控制发送速度,实际发送窗口取 cwnd 和接收窗口 rwnd 的较小值。

② 刚建立连接时使用慢启动,cwnd 按指数增长;达到慢启动阈值后进入拥塞避免,改为线性增长。

③ 如果发生超时,说明拥塞较严重,TCP 会减小阈值并把 cwnd 降到较小值,重新慢启动。

④ 如果收到三个重复 ACK,则触发快速重传和快速恢复,立即重传丢失数据,并将窗口减半后继续拥塞避免。

最核心的一句话:

TCP 通过“先快速试探、再缓慢增长、发生丢包就降低发送速率”的方式实现拥塞控制

17. Cookie 和 Session 是什么?有什么区别?

HTTP 本身是无状态协议,服务器默认不会记住前一次请求是谁发出的。

Cookie 和 Session 都用于保存用户状态,例如登录状态、购物车信息等

① Cookie 是保存在客户端浏览器中的小段数据,浏览器会在后续请求中自动携带。

② Session 是保存在服务端的用户会话数据,服务器通常通过 Cookie 中的 Session ID 找到对应 Session。

③ Cookie 会占用客户端存储,安全性相对较低;Session 数据保存在服务端,相对安全,但会增加服务器存储压力。

④ 分布式系统中 Session 需要共享,通常可以存储在 Redis 中。

最核心的一句话:

Cookie 保存在客户端,Session 保存在服务端;实际登录中通常用 Cookie 保存 Session ID,用 Session 保存用户状态。

18. Ping 是怎么工作的?

Ping 是一种用于检测目标主机是否可达以及估算网络往返延迟的工具。

它主要基于网络层的 ICMP 协议,不是 TCP,也不是 UDP。
① Ping 基于网络层的 ICMP 协议,发送 ICMP Echo Request,目标主机收到后返回 ICMP Echo Reply。

② 发送方根据请求和响应之间的时间计算网络往返延迟 RTT,并统计丢包率。

③ Ping 不需要建立 TCP 连接,也没有端口号,只能检测 IP 层面的可达性,不能直接判断某个应用或端口是否正常。

④ Ping 不通不一定代表服务器宕机,也可能是防火墙或目标主机禁用了 ICMP 响应。

最核心的一句话:

Ping 通过 ICMP 回显请求和回显应答,检测目标主机是否可达,并计算网络往返延迟。

19. 什么是 SYN 攻击?如何避免?

① SYN 攻击利用 TCP 三次握手,攻击者发送大量 SYN 请求,但不返回最后一个 ACK,使服务器产生大量处于 SYN_RECV 状态的半连接。

② 当半连接队列和服务器资源被耗尽后,正常客户端就无法建立连接。

③ 常见防护方式包括启用 SYN Cookie、增大半连接队列、缩短重试时间、限制连接速率,以及使用防火墙、负载均衡和 DDoS 流量清洗服务。

最核心的一句话:

SYN 攻击就是大量建立“只握手两次、不完成第三次”的半连接,从而耗尽服务器连接资源。

20. 什么是对称加密和非对称加密?

① 对称加密使用同一把密钥进行加密和解密,速度快,适合大量数据传输,但密钥分发困难,常见算法有 AES。

② 非对称加密使用公钥和私钥,公钥可以公开,私钥需要保密,安全性和密钥管理更好,但速度较慢,常见算法有 RSA 和 ECC。

③ HTTPS 通常结合使用两者:通过非对称密码机制完成身份认证和密钥协商,再使用对称加密传输实际数据。

最核心的一句话:

对称加密速度快但密钥难分发,非对称加密便于认证和密钥协商但速度慢,因此实际系统通常混合使用。

21. HTTPS 是如何保证数据完整性的?

HTTPS 通过 TLS 的消息认证机制保证数据在传输过程中没有被篡改。

核心思想是:

发送方对数据生成一个认证标签,接收方收到后重新校验;只要数据被修改,校验就会失败。

① HTTPS 通过 TLS 的消息认证机制保证数据完整性。

② 现代 TLS 使用 AES-GCM、ChaCha20-Poly1305 等 AEAD 算法,在加密数据的同时生成认证标签。

③ 接收方使用会话密钥验证认证标签,只要密文被修改、重复或乱序,验证就会失败。

④ TLS 握手结束时还会通过 Finished 消息校验整个握手过程是否被篡改。

最核心的一句话:

HTTPS 使用只有通信双方掌握的会话密钥生成认证标签,数据一旦被篡改,接收方就无法通过完整性校验。

22. 数字证书验证流程是什么?

当浏览器访问 HTTPS 网站时,服务器会把自己的数字证书发送给浏览器。浏览器需要确认两件事:

这个证书是否可信,以及证书中的公钥是否真的属于当前网站。

① 服务器在 TLS 握手时向客户端发送数字证书和证书链。

② 浏览器检查证书有效期、访问域名、证书用途以及是否被吊销。

③ 浏览器从服务器证书开始,使用上一级 CA 的公钥逐级验证数字签名,直到可信根 CA。

④ 如果根 CA 位于浏览器或操作系统的信任库中,并且整条证书链验证通过,浏览器就信任证书中的服务器公钥。

最核心的一句话:

数字证书验证就是检查域名和有效期,并沿着证书链使用上级 CA 公钥逐级验证签名,最终追溯到本地信任的根 CA。

操作系统

1. 进程和线程的区别?

进程是程序的一次执行过程,线程是进程中的一条执行路径。

① 进程是资源分配的基本单位,线程是 CPU 调度的基本单位。

② 不同进程拥有独立地址空间,同一进程中的线程共享堆、代码和文件资源,但各自拥有独立的栈、寄存器和程序计数器。

③ 线程创建和切换开销更小,但共享数据容易产生线程安全问题;进程隔离性更强,但通信和切换成本较高。

2. 进程调度算法你了解多少?

进程调度是操作系统从就绪队列中选择一个进程使用 CPU。
常见调度算法有 FCFS、短作业优先、时间片轮转、优先级调度和多级反馈队列。FCFS 简单但可能造成短任务长时间等待;SJF 平均等待时间短但可能使长任务饥饿;时间片轮转较公平,适合分时系统;多级反馈队列综合考虑任务优先级和运行时间,实际系统中较常见。

3. 进程间有哪些通信方式?

不同进程地址空间相互独立,因此需要通过 IPC 进行通信。
常见进程通信方式有管道、消息队列、共享内存、信号量、信号和 Socket。共享内存速度最快,但需要额外的同步机制;消息队列保留消息边界;管道适合简单数据流;Socket 既支持本机通信,也支持跨主机通信。

4. 什么是死锁?如何避免死锁?

死锁是多个线程互相等待对方持有的资源,导致程序无法继续执行。死锁需要同时满足互斥、请求并保持、不可剥夺和循环等待四个条件。实际开发中通常通过统一加锁顺序、减少锁嵌套、设置超时、使用 tryLock 和缩小临界区来避免死锁。

5. 什么是虚拟内存?为什么需要虚拟内存?

虚拟内存是操作系统通过页表为每个进程提供的独立虚拟地址空间。它可以实现进程隔离、按需加载、内存共享,并让程序使用看起来连续且可能大于物理内存的地址空间。其核心是虚拟地址到物理地址的映射。

6. 什么是内存分段和分页?它们的作用是什么?

分段按照代码段、数据段、堆和栈等逻辑结构划分内存,段大小不固定,容易产生外部碎片。分页把虚拟内存和物理内存划分为固定大小的页和页框,通过页表进行映射,避免了外部碎片,是虚拟内存实现的基础。

7. 解释一下用户态和内核态?

用户态权限较低,普通程序不能直接访问硬件和内核资源;内核态权限最高,可以执行特权指令和管理系统资源。应用程序通过系统调用、中断或异常从用户态切换到内核态。区分两种状态主要是为了保护操作系统安全和稳定。

8. 解释一下页面置换算法,例如 LRU(最近最少使用)、FIFO(先进先出)等?

页面置换算法用于物理内存不足时选择要淘汰的页面。FIFO 淘汰最早进入的页面,实现简单但可能出现 Belady 异常;LRU 淘汰最近最少使用的页面,效果较好但维护成本高;Clock 算法利用访问位近似实现 LRU,是实际系统中常用的方案。

9. 解释一下进程同步和互斥,以及解决这些问题的方法?

互斥是保证同一时刻只有一个线程访问共享资源,同步是保证多个线程按照一定顺序协作执行。常见实现方式包括互斥锁、信号量、条件变量、管程、原子操作和自旋锁。

10. 什么是中断和异常?它们有什么区别?

中断和异常都会使 CPU 暂停当前程序,转而执行相应的处理程序。
中断通常由外部硬件异步触发,例如网卡和定时器;异常由当前指令同步触发,例如缺页、除零和非法访问。两者都会使 CPU 暂停当前任务,进入内核执行对应处理程序。

11. 介绍一下几种典型的锁?

典型锁包括互斥锁、自旋锁、读写锁、悲观锁、乐观锁和可重入锁。互斥锁获取失败会阻塞,自旋锁会持续尝试;读写锁适合读多写少;悲观锁先加锁再操作,乐观锁通常通过 CAS 或版本号在更新时检测冲突。

12. 你知道的线程同步方式有哪些?

线程同步方式主要有互斥锁、信号量、条件变量、读写锁、自旋锁、原子操作、屏障和事件通知。互斥锁解决共享资源竞争,条件变量用于线程等待和通知,信号量限制并发数量,原子操作适合简单且高频的无锁更新。

数据库

1. 一条 SQL 查询语句是如何执行的?

① 客户端先与 MySQL 建立连接并发送 SQL,连接器负责身份认证和权限管理。

② 解析器对 SQL 进行词法、语法分析,预处理器检查表和字段是否存在。

③ 优化器根据索引和统计信息生成执行计划,决定使用哪个索引、表连接顺序等。

④ 执行器按照执行计划调用存储引擎接口,InnoDB 从 Buffer Pool 或磁盘中读取数据,并通过 B+ 树索引定位记录。

⑤ 最后执行器将查询结果返回给客户端。

最适合背诵的一句话:

一条查询 SQL 会依次经过连接器、解析器、预处理器、优化器和执行器,执行器调用存储引擎读取数据,最后将结果返回客户端。

2. 说一说事务隔离级别?

①读未提交(READ UNCOMMITTED):可以读到其他事务尚未提交的数据,可能出现脏读、不可重复读和幻读。

②读已提交(READ COMMITTED):只能读到已提交的数据,解决脏读;但同一事务前后两次读取,结果仍可能不同。

③可重复读(REPEATABLE READ):同一事务多次读取同一行,结果保持一致。InnoDB 默认使用该级别,并通过 MVCC 和锁处理并发读取。

④串行化(SERIALIZABLE):通过让事务串行执行来提供最高隔离性,但并发能力最低。

最核心的一句话:

隔离级别从低到高是读未提交、读已提交、可重复读、串行化;隔离性越强,并发性能通常越低。InnoDB 的可重复读还会结合 MVCC 和临键锁处理快照读取及锁定范围查询。

3. 事务的四大特性有哪些?

①原子性(Atomicity):事务中的操作要么全部成功,要么全部失败,通常通过 undo log 回滚。

②一致性(Consistency):事务执行前后,数据都要满足业务规则和完整性约束。

③隔离性(Isolation):并发事务彼此隔离,避免互相读到不符合隔离级别的数据,主要依靠锁和 MVCC。

④持久性(Durability):事务提交后,结果即使遇到故障也能恢复,InnoDB 主要依靠 redo log。

最核心的一句话:

ACID 分别是原子性、一致性、隔离性和持久性;它们共同保证事务可靠地改变数据。

4. 索引有哪些种类?

①按功能分:有主键索引、唯一索引、普通索引和联合索引。

②按数据存储方式分:有聚簇索引和二级索引。InnoDB 的主键索引是聚簇索引,叶子节点保存整行数据;二级索引的叶子节点保存索引列和主键值。

③按数据结构分:常见的有 B+ 树索引、哈希索引、全文索引和空间索引;具体支持情况与存储引擎有关,InnoDB 最常用的是 B+ 树索引。

最核心的一句话:

面试时可以先按功能介绍主键、唯一、普通和联合索引,再说明 InnoDB 中的聚簇索引与二级索引。

5. MySQL 为什么使用 B+ 树作为索引?它的优势是什么?

① B+ 树的非叶子节点主要保存索引键,单个节点能容纳更多索引项,树的高度较低,查询时磁盘 I/O 较少。

② 所有数据都在叶子节点,查询路径稳定;叶子节点按顺序连接,适合范围查询和排序。

③ 相比哈希索引,B+ 树支持范围查找和有序遍历;相比普通二叉树,B+ 树更适合磁盘页读取。

最核心的一句话:

B+ 树能减少磁盘 I/O,同时支持范围查询和有序遍历,因此适合作为关系型数据库的主要索引结构。

6. 什么时候需要创建索引?什么时候不需要创建索引?

① 经常出现在WHERE、JOIN、ORDER BY、GROUP BY中,并且能明显缩小结果范围的列,通常适合建索引。

② 多列经常一起作为查询条件时,可以按实际查询方式建立联合索引,并注意最左前缀原则;覆盖索引还可以减少回表。

③ 表很小、列区分度很低、字段很少被查询,或写入更新非常频繁时,索引收益可能不大。

④ 索引会占用存储空间,也会增加INSERT、UPDATE、DELETE的维护成本。因此要结合慢查询和EXPLAIN执行计划决定,避免盲目加索引。

最核心的一句话:

索引优先建在高频查询、过滤效果好的列上,同时权衡写入成本、存储占用和实际执行计划。

7. 说一下你了解的 MVCC 机制,并说明原理?

① MVCC 是多版本并发控制,让普通一致性读读取符合事务可见性规则的历史版本,减少读写之间的阻塞。

② InnoDB 通过隐藏字段、undo log 版本链和 Read View 实现 MVCC。数据更新时,旧版本保存在 undo log 中;Read View 根据事务 ID 判断哪个版本对当前事务可见。

③ 在 InnoDB 中,读已提交通常每次一致性读都会生成新的 Read View;可重复读通常在事务第一次一致性读时生成 Read View,并在事务内复用。

④ 普通SELECT通常是快照读;UPDATE、DELETE和SELECT ... FOR UPDATE等属于当前读,会读取较新的记录并按需加锁。

最核心的一句话:

MVCC 通过 undo log 保存数据的历史版本,再通过 Read View 判断当前事务能看到哪个版本,让快照读尽量不阻塞写入。

8. 索引失效的场景有哪些?

①不符合联合索引最左前缀原则:例如联合索引是(a, b),查询只使用b,通常无法有效利用该索引。

②对索引列进行函数或表达式计算:例如对日期列使用DATE(create_time),可能导致索引无法直接用于查找。

③发生隐式类型转换:例如字符串列与数字进行比较,可能导致索引无法有效使用。

④使用前导模糊匹配:例如LIKE '%abc',通常无法利用普通 B+ 树索引定位开头。

⑤使用 OR 时有条件列没有索引:优化器可能选择全表扫描;具体是否走索引要看执行计划。

⑥联合索引中出现范围查询:范围条件之后的列通常不能继续用于缩小索引查找范围,但仍可能参与其他优化。

⑦索引区分度低或表很小:优化器判断全表扫描成本更低时,也可能主动不使用索引。

最核心的一句话:

排查索引问题时,重点看最左前缀、索引列上的函数或类型转换、前导模糊匹配,以及EXPLAIN显示的实际执行计划。

9. MySQL 的执行引擎有哪些?

①InnoDB:最常用的引擎,支持事务、行级锁、外键和崩溃恢复,适合大多数业务表。

②MyISAM:不支持事务,主要使用表级锁,常用于读多写少的场景。

③MEMORY:将表数据保存在内存中,访问速度快,但服务器重启后数据会丢失,适合临时或可重建的数据。

最核心的一句话:

常见引擎有 InnoDB、MyISAM 和 MEMORY;业务表通常优先使用支持事务和崩溃恢复的 InnoDB。

10. MySQL 日志文件有哪几种?有什么作用?

①redo log:InnoDB 的重做日志,记录数据页的修改,用于崩溃恢复,保证事务的持久性。

②undo log:保存数据修改前的旧版本,用于事务回滚,也为 MVCC 提供历史版本。

③binlog:MySQL Server 层的归档日志,记录数据变更,可用于主从复制和时间点恢复。

④relay log:从库保存主库传来的 binlog 内容,用于主从复制。

⑤error log:记录 MySQL 启动、运行和停止过程中的错误及诊断信息。

⑥slow query log:记录执行时间较长的 SQL,用于定位性能问题。

⑦general query log:记录客户端连接和服务器收到的语句,通常按需开启。

最核心的一句话:

redo log 用于崩溃恢复,undo log 用于回滚和 MVCC,binlog 用于归档、复制和恢复;错误日志与慢查询日志分别用于故障排查和性能分析。

11. MySQL 有哪些锁?作用分别是什么?

①按粒度分:有全局锁、表级锁和行级锁。全局锁限制全库写入,表级锁锁定整张表,行级锁只锁相关记录,通常并发能力更高。

②按兼容性分:有共享锁(S 锁)和排他锁(X 锁)。共享锁主要用于读取,允许其他事务继续读取;排他锁用于修改,会阻止其他事务对相关记录进行冲突操作。

③意向锁:InnoDB 用它表示事务准备对表中的行加共享锁或排他锁,便于协调表级锁和行级锁。

④记录锁、间隙锁和临键锁:记录锁锁定索引记录;间隙锁锁定索引记录之间的范围,阻止插入;临键锁是记录锁与间隙锁的组合,用于控制索引范围上的并发。

⑤ InnoDB 的行锁实际是加在索引记录上的;如果查询没有合适的索引,可能扫描并锁定大量记录,影响并发。

最核心的一句话:

面试先说明全局锁、表级锁、行级锁和共享锁、排他锁,再补充 InnoDB 通过记录锁、间隙锁和临键锁控制索引记录及范围上的并发。

Redis

1. Redis 为什么这么快?

① 基于内存存储,读写速度远快于磁盘。
② 采用单线程执行命令,避免了线程切换和锁竞争。
③ 使用I/O 多路复用,可以同时处理大量客户端。
④ 事件驱动。Redis 会将连接、读写等操作注册为事件,当事件就绪后再进行处理,因此能够高效应对大量并发请求。
⑤ 高效的数据结构。

2. Redis 的数据类型有哪些?

有五种数据类型:
① string(最基本的数据类型),
② hash(键值对集合),
③ set(无序集合)
④ zset(有序集合)
⑤ list

3. 说一说 Redis 持久化机制?

作答版:
Redis的持久化机制是为了保证数据在服务器重启或者异常情况下不丢失而设计的,Redis提供了两种主要的持久化方式:
①RDB(特定的时间间隔内生成数据的时间点快照)
②AOF(记录了所有对Redis数据集进行更改的写操作,这些写操作追加到一个文件中)
RDB 类似于定期备份,而 AOF 类似于实时记录。

补充:

①RDB(Redis Database)持久化
RDB是Redis默认的持久化方式,它通过在特定的时间间隔内生成数据的时间点快照来实现持久化。快照文件以二进制的格式保存了Redis在某一时刻的数据集。
RDB持久化的优点是生成的快照文件较小,适用于备份
缺点是如果Redis服务器突然崩溃,可能会丢失最后一次快照之后的数据。

②AOF(Append Only File)持久化
AOF持久化记录了所有对Redis数据集进行更改的写操作,这些写操作以追加的方式写入一个文件中。
当Redis服务器重新启动的时候,它会重新执行AOF文件中记录的写操作,从而恢复数据集的状态。
AOF持久化的优点是提供了更可靠的持久性,因为数据变更操作记录被记录在一个追加的日志文件中,可以减少数据丢失的风险。
缺点是AOF文件通常比RDB文件更大,而且恢复数据时可能需要更长的时间。

RDB 类似于定期备份,而 AOF 类似于实时记录。

4. Redis 过期键的删除策略?

惰性删除。键被访问的时候才检查是否过期,这样做得好处是可以降低redis的CPU使用率,并且避免了定期检查所有键的开销。
惰性删除流程如下:
①当客户端尝试读取一个键时,redis会首先检查是否过期
②如果键已经过期,redis会返回空值(null),并在返回之前删除该键
③如果键未过期,redis将正常返回其值

5. 什么是缓存击穿、缓存穿透、缓存雪崩?

穿透 → 查不存在的数据 → 布隆过滤器 + 空值缓存
击穿 →一个热点key过期 → 互斥锁 + 不过期
雪崩 →一批key同时过期 或 Redis挂了 → 随机过期时间 + 高可用 + 限流

6. 如何保证缓存和数据库双写时的一致性?

没有完美方案,只能尽量降低不一致窗口。
业界主流方案:Cache Aside(旁路缓存)+ 先删库后删缓存
进阶方案:binlog

7. Redis 是单线程的还是多线程的?

Redis 主要采用单线程模型进行命令处理,但在处理网络 I/O 和一些后台任务(比如持久化和集群数据分片)时,会利用多线程来提高效率。核心的键值存储操作是在单个主线程中执行的,这简化了并发控制,同时由于操作都是在内存中进行,因此能够实现极高的性能。

8. Redis 事务的相关命令有哪些?

① MULTI,开启事务,后续命令逐个放入队列中,然后EXEC命令原子化执行这个命令队列
② EXEC,执行事务中所有操作命令
③ DISCARD,放弃执行事务中所有操作命令
④ WATCH,监视一个或多个key,如果事务在执行前,这个key被其他命令修改,则事务被中断,不会执行事务中的任何命令
⑤ UNWATCH,取消WATCH对所有key的监

9. Redis 事务支持隔离性吗?为什么不支持回滚?

redis的事务提供了一种批量执行命令的机制,但不具备ACID特性中的隔离性和回滚功能

10. 介绍一下 Redis 的哨兵机制?

哨兵(Sentinel)机制是一种用来监控和管理Redis服务器是否正常工作以及在需要时进行自动故障转移的系统。哨兵系统可以提高Redis的可用性,确保数据的安全性和服务的连续性。

11. Redis 哨兵是如何工作的?

哨兵每秒向主节点发送心跳检测,ping主节点。当一段时间(十几秒到几十秒)内心跳检测没有收到回复,则这个哨兵主观认为主节点下线。当超过一半数量哨兵认为主节点下线,主节点被认为客观下线,并由哨兵任命一个从节点为主节点。升级逻辑为优先级高的节点,其次是offset大的节点,因为offset大代表这个节点同步的数据多,丢失的信息少。

12. 了解主从复制的原理吗?

主从复制指将一台redis服务器的数据,复制到其他的redis服务器,这种复制是单向异步的。

返回列表