八股文面试攻略五:数据库

一、MYSQL

1、数据库三大范式

  • 1NF:字段原子性(不能再拆),数据库表的每一列必须是不可再分的原子数据。
  • 2NF:消除部分依赖(主键是多字段时),在满足 1NF 的基础上,非主键字段必须完全依赖于整套主键,而不是主键的一部分。
  • 3NF:消除传递依赖(非主键依赖非主键),在满足 2NF 基础上,非主键字段不能依赖其他非主键字段。

2、Mysql CUP飙升,该怎么处理?

  1. 首先使用top命令查看是否由MYSQL引起的(mysqld 是否占用最高 CPU)
  2. 定位“当前正在消耗 CPU 的 SQL”(命令:SHOW FULL PROCESSLIST)
  3. 查看 MySQL 当前最耗资源的 SQL
  4. 对可疑 SQL 做诊断
  5. 从三个角度优化慢 SQL:索引优化、SQL 本身过重(需要改写)、业务访问量过大(并发导致 CPU 打满)
  6. 检查锁问题(锁导致 CPU 假飙升)
  7. 紧急情况下 Kill 大 SQL + 限流止血

高 CPU 的根本原因几乎都是 → SQL 不走索引 + 高并发查询同一条低效 SQL。

3、如何定位以及优化SQL语句的性能问题?或者如何解决慢查询问题?

定位谁慢 → 看执行计划 → 查索引和扫描行数 → 改 SQL / 加索引 / 减数据量 → 再验证。

  1. 开启慢查询日志
  2. 查看当前正在执行的语句
  3. 使用 performance_schema 汇总统计

4、SQL语句在MYSQL是如何执行的?

首先,我们借助网上的图片了解MYSQL逻辑架构图:

Sever 层:连接器、查询缓存、分析器、优化器、执行器

存储引擎层:负责数据的存储和提取。

(1)连接器

负责跟客户端建立连接、获取权限、维持和管理连接

(2)查询缓存

简言之,MySQL 会缓存查询语句以及其结果,以 key-value 形式缓存。(key 为查询语句,value 为缓存结果)

注意:不建议开启,查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。

(3)分析器

分为词法分析和语法分析两部分

  • 词法分析:识别出 SQL 语句中的 Table,column

  • 语法分析:判断 SQL 语句是否满足 mysql 语法规则

(4)优化器

  1. 决定使用哪个索引(多个索引)

  2. 决定表的连接顺序(多表关联)

(5)执行器

  1. 首先会判断用户权限

  2. 真正的执行SQL 语句所对应的行为

(6)存储引擎

负责真正的数据读写

总而言之,MySQL内部执行SQL查询语句的过程涉及词法分析、语法分析、查询优化器、执行计划生成、数据访问层和存储引擎等多个步骤,以最高效地获取和处理数据,并将结果返回给客户端。

5、什么是视图?为什么要使用视图?

视图的定义

视图是一个虚表,是从一个或几个基本表(或视图)导出的表。它只存放视图的定义,不存放视图对应的数据。当基表中的数据发生变化时,从视图中查询出的数据也会随之改变。

特点

特点详情
虚表视图不存储实际数据,仅存储定义.
动态性基表数据变化时,视图数据自动更新。

作用

  1. 简化用户操作。视图可以简化复杂的查询操作。比如,将多表连接查询封装为视图,你只需查询视图即可。
  2. 从多角度数据查看。视图允许你以不同角度查看同一数据。比如,为不同部门创建不同的视图,展示其关心的数据。
  3. 增强数据库重构的逻辑性。视图可以在不影响应用程序的情况下重构数据库。比如,修改基表结构时,通过视图保持应用程序的兼容性。
  4. 保护敏感数据。视图可以隐藏敏感数据,仅展示必要信息。比如,创建视图,仅展示非敏感字段,保护用户隐私。
  5. 优化查询表达。视图可以使查询语句更简洁、易读。比如,将复杂查询逻辑封装为视图,简化查询语句。

6、索引在哪种情况会失效?

  1. 不满足最左前缀原则。
  2. 使用select* 
  3. 索引列上有计算
  4. 索引列用了函数
  5. 字段类型不同
  6. like左边包含%
  7. 列比对
  8. 使用or关键字
  9. not in和not exists
  10. order by的坑

最左前缀原则:顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上。

7、索引的目的和代价是分别是什么?

索引本质是一种有序的数据结构(B+ 树 / Hash)

目的:

  1. 提升查询速度
  2. 加速排序order by、Group by
  3. 加速join操作
  4. 提高唯一性约束效率
  5. 加速范围查询、前缀查询

索引的目的是减少 IO,提高查询、排序、连接、范围检索的性能。

索引的代价

  1. 占用存储空间
  2. 写操作(INSERT/UPDATE/DELETE)变慢。因为数据表变化对应的索引也必须同步,B+树要维护平衡,可会导致节点分裂、合并、移动
  3. 索引会带来维护成本
  4. 索引失效会导致反效果

补充

HAVING 用于对 GROUP BY 的聚合结果进行过滤。

ORDER BY 用于对最终结果排序。

8、主键索引和唯一索引的区别?

主键索引

  • 强制实体完整性,唯一标识表中的每一行
  • 列值不允许重复且不能为NULL
  • 每个表只能有一个主键

唯一索引

  • 仅确保列或列组合的值唯一
  • 允许包含NULL值
  • 一个表可以有多个唯一索引

索引类型

主键索引

  • 默认为聚簇索引,决定数据在磁盘的物理存储顺序。
  • 叶子节点直接存储数据行,查询效率高。

唯一索引

  • 通常为非聚簇索引,仅存储索引键值和对应主键的引用
  • 查询时可能需要回表操作。

总得来说,主键索引是唯一标识符,强调行的唯一性和非空性,影响数据存储结构。唯一索引是辅助约束,保证列值的唯一性,允许灵活处理NULL值,常用于业务层面的去重需求。

9、聚集索引和非聚集索引的区别?

聚集索引:数据按索引排序,叶子节点就是数据,只能有一个,查询快(日常主键)

非聚集索引:索引和数据分离,叶子节点存主键,需要回表,可建多个,范围查询表现差

10、什么是覆盖索引?

覆盖索引 = 查询所需要的所有字段都在索引里,不需要回表。减少了树的搜索次数,显著提升性能。

什么时候无法使用?

  1. select *(字段太多)
  2. 查询字段中包含未在索引里的字段
  3. where 条件命中索引,但返回字段不在索引中(必须回表)
  4. 字段太长,不能放到索引中

11、什么是回表查询?原理是什么?

回表是指MySQL在使用索引查找数据时,首先通过索引查找到数据的主键唯一键,然后再根据该主键或唯一键去数据表中查询真实数据的过程。换句话说,回表意味着MySQL并没有在索引中获取到所有需要的数据,而是需要使用主键信息,再次从数据表中查询相应的字段。

简单来说,我在图书馆查资料,通过软件定位到书的位置,但具体的资料仍需要手动去找到。

回表的原理

非聚集索引指向记录的“主键值”,而非内容本身。因此需要回表查询具体信息

如何减少回表?

  • 避免select* ,只查询必要字段
  • 优化索引,让查询字段都在索引覆盖范围内
  • 合理设计组合索引
  • 常查询字段放入索引中。

12、什么是最左匹配规则?原理是什么?

最左匹配原则是指在使用多列索引(联合索引)时,数据库会优先匹配索引的最左边的列,然后逐渐向右匹配列。如果查询中没有使用到索引的最左边的列,那么该索引将不会被使用。

原理

最左匹配原则的原理基于B+树结构。B+树的节点存储索引顺序是从左向右存储,在检索匹配时也要满足自左向右匹配。例如,假设有一个包含三列的联合索引 (a, b, c),那么在查询语句中,如果只使用了列 b 和 c,该索引将不会被使用。但如果查询语句中使用了列 a 和 b 或 a 和 c,那么该索引就可以被使用。

13、什么是索引下推?原理是什么?

索引下推(Index Condition Pushdown,简称 ICP)是 MySQL 从 5.6 版本开始引入的一种查询优化技术,旨在减少回表操作的次数,从而提升查询性能。其核心思想是在索引扫描阶段尽早过滤不符合条件的记录,避免不必要的数据页访问

原理

在传统查询中,MySQL 会先通过索引扫描获取满足部分条件的记录,然后回表获取完整数据并进行剩余条件的过滤。这种方式可能导致大量不必要的回表操作,增加磁盘 I/O 开销。

索引下推通过将部分查询条件直接下推到索引扫描阶段,使得 MySQL 在扫描索引时就能过滤掉不符合条件的记录。只有满足所有索引条件的记录才会触发回表操作,从而显著减少数据页访问次数。

14、InnoDB与MyISAM的区别?

特性InnoDBMyISAM
事务(Transaction)✔ 支持❌ 不支持
外键(Foreign Key)✔ 支持❌ 不支持
锁机制行级锁(Row Lock) + MVCC表级锁(Table Lock)
崩溃恢复能力强(Redo Log/Undo Log)弱(容易损坏)
全文索引部分版本支持早期版本原生支持
存储结构聚集索引(数据和主键存一起)非聚集索引(数据单独存放)
读写性能适合多并发写适合大量读
空间占用较大较小

InnoDB 功能更强,支持事务、行锁、外键,崩溃不坏数据,是 MySQL 默认存储引擎;
MyISAM 更轻量,但无事务、无行锁、无崩溃恢复,适合只读或低并发场景。

15、索引为什么使用B+树而不是二叉树或者B树?

为什么二叉树/红黑树不行?

树太高。二叉树每个节点只有两个孩子 → 深度会变得很大。当数据达到千万级别时,高度非常大,就需要大量磁盘IO,性能急剧下降。

B 树(B-Tree)为什么不够好?

  • 内部节点也存储数据
  • 范围查询不方便

B+ 树比二叉树更矮 → 更少磁盘 IO;
B+ 树比 B 树更适合范围查询 → 叶子链表顺序访问;
B+ 树内部节点只存 key → 每页可存更多索引 → 更矮更快。

16、数据库事务的四个特性以及含义?

  • 原子性(Atomicity):事务中的操作要么全部成功,要么全部失败,不允许只执行一部分。
  • 一致性(Consistency):事务执行前后,数据库必须从一个一致状态转换到另一个一致状态,不违反任何约束(外键、唯一性、业务逻辑等)。
  • 隔离性(Isolation):并发环境下,一个事务的执行不应被其他事务干扰。未提交的数据对其他事务不可见。
  • 持久性(Durability):事务提交后,对数据的修改是永久的,即使系统崩溃也不会丢失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值