一、MYSQL
1、数据库三大范式
- 1NF:字段原子性(不能再拆),数据库表的每一列必须是不可再分的原子数据。
- 2NF:消除部分依赖(主键是多字段时),在满足 1NF 的基础上,非主键字段必须完全依赖于整套主键,而不是主键的一部分。
- 3NF:消除传递依赖(非主键依赖非主键),在满足 2NF 基础上,非主键字段不能依赖其他非主键字段。
2、Mysql CUP飙升,该怎么处理?
- 首先使用top命令查看是否由MYSQL引起的(mysqld 是否占用最高 CPU)
- 定位“当前正在消耗 CPU 的 SQL”(命令:SHOW FULL PROCESSLIST)
- 查看 MySQL 当前最耗资源的 SQL
- 对可疑 SQL 做诊断
- 从三个角度优化慢 SQL:索引优化、SQL 本身过重(需要改写)、业务访问量过大(并发导致 CPU 打满)
- 检查锁问题(锁导致 CPU 假飙升)
- 紧急情况下 Kill 大 SQL + 限流止血
高 CPU 的根本原因几乎都是 → SQL 不走索引 + 高并发查询同一条低效 SQL。
3、如何定位以及优化SQL语句的性能问题?或者如何解决慢查询问题?
定位谁慢 → 看执行计划 → 查索引和扫描行数 → 改 SQL / 加索引 / 减数据量 → 再验证。
- 开启慢查询日志
- 查看当前正在执行的语句
- 使用 performance_schema 汇总统计
4、SQL语句在MYSQL是如何执行的?
首先,我们借助网上的图片了解MYSQL逻辑架构图:

Sever 层:连接器、查询缓存、分析器、优化器、执行器
存储引擎层:负责数据的存储和提取。
(1)连接器
负责跟客户端建立连接、获取权限、维持和管理连接
(2)查询缓存
简言之,MySQL 会缓存查询语句以及其结果,以 key-value 形式缓存。(key 为查询语句,value 为缓存结果)
注意:不建议开启,查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。
(3)分析器
分为词法分析和语法分析两部分
-
词法分析:识别出 SQL 语句中的 Table,column
-
语法分析:判断 SQL 语句是否满足 mysql 语法规则
(4)优化器
-
决定使用哪个索引(多个索引)
-
决定表的连接顺序(多表关联)
(5)执行器
-
首先会判断用户权限
-
真正的执行SQL 语句所对应的行为
(6)存储引擎
负责真正的数据读写
总而言之,MySQL内部执行SQL查询语句的过程涉及词法分析、语法分析、查询优化器、执行计划生成、数据访问层和存储引擎等多个步骤,以最高效地获取和处理数据,并将结果返回给客户端。
5、什么是视图?为什么要使用视图?
视图的定义
视图是一个虚表,是从一个或几个基本表(或视图)导出的表。它只存放视图的定义,不存放视图对应的数据。当基表中的数据发生变化时,从视图中查询出的数据也会随之改变。
特点
| 特点 | 详情 |
| 虚表 | 视图不存储实际数据,仅存储定义. |
| 动态性 | 基表数据变化时,视图数据自动更新。 |
作用
- 简化用户操作。视图可以简化复杂的查询操作。比如,将多表连接查询封装为视图,你只需查询视图即可。
- 从多角度数据查看。视图允许你以不同角度查看同一数据。比如,为不同部门创建不同的视图,展示其关心的数据。
- 增强数据库重构的逻辑性。视图可以在不影响应用程序的情况下重构数据库。比如,修改基表结构时,通过视图保持应用程序的兼容性。
- 保护敏感数据。视图可以隐藏敏感数据,仅展示必要信息。比如,创建视图,仅展示非敏感字段,保护用户隐私。
- 优化查询表达。视图可以使查询语句更简洁、易读。比如,将复杂查询逻辑封装为视图,简化查询语句。
6、索引在哪种情况会失效?
- 不满足最左前缀原则。
- 使用select*
- 索引列上有计算
- 索引列用了函数
- 字段类型不同
- like左边包含%
- 列比对
- 使用or关键字
- not in和not exists
- order by的坑
最左前缀原则:顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上。
7、索引的目的和代价是分别是什么?
索引本质是一种有序的数据结构(B+ 树 / Hash)
目的:
- 提升查询速度
- 加速排序order by、Group by
- 加速join操作
- 提高唯一性约束效率
- 加速范围查询、前缀查询
索引的目的是减少 IO,提高查询、排序、连接、范围检索的性能。
索引的代价
- 占用存储空间
- 写操作(INSERT/UPDATE/DELETE)变慢。因为数据表变化对应的索引也必须同步,B+树要维护平衡,可会导致节点分裂、合并、移动
- 索引会带来维护成本
- 索引失效会导致反效果
补充
HAVING 用于对 GROUP BY 的聚合结果进行过滤。
ORDER BY 用于对最终结果排序。
8、主键索引和唯一索引的区别?
主键索引
- 强制实体完整性,唯一标识表中的每一行
- 列值不允许重复且不能为NULL。
- 每个表只能有一个主键。
唯一索引
- 仅确保列或列组合的值唯一
- 允许包含NULL值
- 一个表可以有多个唯一索引
索引类型
主键索引
- 默认为聚簇索引,决定数据在磁盘的物理存储顺序。
- 叶子节点直接存储数据行,查询效率高。
唯一索引
- 通常为非聚簇索引,仅存储索引键值和对应主键的引用
- 查询时可能需要回表操作。
总得来说,主键索引是唯一标识符,强调行的唯一性和非空性,影响数据存储结构。唯一索引是辅助约束,保证列值的唯一性,允许灵活处理NULL值,常用于业务层面的去重需求。
9、聚集索引和非聚集索引的区别?
聚集索引:数据按索引排序,叶子节点就是数据,只能有一个,查询快(日常主键)
非聚集索引:索引和数据分离,叶子节点存主键,需要回表,可建多个,范围查询表现差
10、什么是覆盖索引?
覆盖索引 = 查询所需要的所有字段都在索引里,不需要回表。减少了树的搜索次数,显著提升性能。
什么时候无法使用?
- select *(字段太多)
- 查询字段中包含未在索引里的字段
- where 条件命中索引,但返回字段不在索引中(必须回表)
- 字段太长,不能放到索引中
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的区别?
| 特性 | InnoDB | MyISAM |
|---|---|---|
| 事务(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):事务提交后,对数据的修改是永久的,即使系统崩溃也不会丢失。
2769

被折叠的 条评论
为什么被折叠?



