MySQL 数据库核心知识点详解
一、数据库基础知识
1. 数据库的三大范式
- 第一范式(1NF):属性不可再分,确保每列都是原子的。
- 第二范式(2NF):在1NF基础上,消除非主属性对码的部分函数依赖。
- 第三范式(3NF):在2NF基础上,消除非主属性对码的传递函数依赖。
2. 主键与外键的区别
- 主键:唯一标识一条记录,不可重复、不可为空,一个表只能有一个主键。
- 外键:用于建立表间关联,引用另一表的主键,可重复、可为空,一个表可有多个外键。
3. 外键与级联的争议
- 不推荐使用原因:
- 增加复杂性,影响更新和删除操作。
- 维护成本高,不利于分库分表。
- 优点:保证数据一致性和完整性,简化业务逻辑。
4. 存储过程
- 预编译的SQL语句集合,包含业务逻辑。
- 优点:执行效率高,复用性强。
- 缺点:难以调试、移植性差,阿里规范禁止使用。
5. DROP、DELETE、TRUNCATE的区别
操作 | 类型 | 功能 | 速度 |
---|
DROP | DDL | 删除表结构和数据 | 最快 |
TRUNCATE | DDL | 删除数据,保留结构 | 中等 |
DELETE | DML | 删除指定行,可回滚 | 最慢 |
二、MySQL基础
1. 关系型数据库
- 基于关系模型,支持一对一、一对多、多对多关系。
- 提供完整性约束(如主键、外键、唯一性等)。
2. SQL与NoSQL对比
特性 | SQL(关系型) | NoSQL(非关系型) |
---|
数据结构 | 表结构,严格约束 | 灵活(文档、键值、图等) |
事务支持 | 强一致性(ACID) | 最终一致性或弱一致性 |
查询语言 | 标准SQL | 无统一语言 |
存储方式 | 磁盘 | 内存或磁盘 |
3. 视图
- 虚拟表,基于一个或多个实际表生成。
- 支持CRUD操作,不影响底层表结构。
4. 连接类型
- 内连接:只返回匹配的记录。
- 左外连接:返回左表全部记录,右表不匹配为NULL。
- 右外连接:返回右表全部记录,左表不匹配为NULL。
三、MySQL字段类型
1. 常用类型
- 数值型:INT、BIGINT、FLOAT、DOUBLE、DECIMAL
- 字符串型:CHAR、VARCHAR
- 日期时间型:DATE、DATETIME
2. CHAR vs VARCHAR
- CHAR:定长,适合长度固定的字段(如身份证、订单号)。
- VARCHAR:变长,适合长度不定的字段(如用户名、标题)。
3. DECIMAL vs FLOAT/DOUBLE
- DECIMAL:精确小数,适合金额等精度要求高的场景。
- FLOAT/DOUBLE:近似值,计算快但存在精度损失。
4. NULL vs 空字符串
- NULL:表示未知值,不占存储空间(但指针占空间),聚合函数忽略。
- 空字符串:长度为0的字符串,占存储空间。
四、MySQL存储引擎
1. 常见引擎对比
引擎 | 事务支持 | 外键支持 | 锁机制 | 适用场景 |
---|
InnoDB | 支持 | 支持 | 行级锁 | 高并发、事务操作 |
MyISAM | 不支持 | 不支持 | 表级锁 | 读多写少 |
2. InnoDB与MyISAM的COUNT(*)差异
- MyISAM:内置计数器,直接返回结果。
- InnoDB:实时统计,需全表扫描。
五、MySQL索引
1. 索引概述
- 索引是排好序的数据结构,用于加速查询。
- MySQL默认使用B+树作为索引结构。
2. 索引类型
- 主键索引:唯一、非空。
- 唯一索引:唯一、可空。
- 普通索引:无限制。
- 全文索引:用于文本检索。
3. 索引优缺点
- 优点:加快查询速度,保证唯一性。
- 缺点:占用空间,降低写操作性能。
4. 索引失效场景
- 使用
LIKE '%xx'
模糊查询。 - 对索引列使用函数或表达式。
- OR条件中非索引列参与。
- 违反最左前缀原则。
5. 最左前缀原则
六、MySQL日志
1. 常见日志类型
- Undo Log:用于事务回滚和MVCC。
- Redo Log:保证事务持久性,宕机后恢复数据。
- Bin Log:用于数据备份和主从同步。
- 慢查询日志:记录执行时间超阈值的SQL。
2. Redo Log与持久性
- 事务提交时,Redo Log按策略刷盘,确保数据不丢失。
3. Undo Log与原子性
七、MySQL事务
1. 事务特性(ACID)
- 原子性:全部成功或全部失败。
- 一致性:事务前后数据状态合法。
- 隔离性:并发事务互不干扰。
- 持久性:事务提交后数据永久保存。
2. 并发问题
3. 隔离级别
级别 | 脏读 | 不可重复读 | 幻读 |
---|
读未提交 | ✅ | ✅ | ✅ |
读已提交 | ❌ | ✅ | ✅ |
可重复读 | ❌ | ❌ | ✅ |
串行化 | ❌ | ❌ | ❌ |
MySQL默认隔离级别:可重复读
4. MVCC(多版本并发控制)
- 通过Undo Log链和ReadView实现非锁定读。
- 解决脏读、不可重复读,减少幻读。
八、MySQL锁
1. 锁分类
- 按粒度:
- 表级锁:锁定整表,并发低。
- 行级锁:锁定单行,并发高。
- 按行为:
- 共享锁(读锁):允许多个读,禁止写。
- 排他锁(写锁):禁止其他任何操作。
2. 意向锁
3. 悲观锁 vs 乐观锁
类型 | 加锁时机 | 实现方式 | 适用场景 |
---|
悲观锁 | 访问前加锁 | 阻塞等待 | 高并发竞争 |
乐观锁 | 更新时检查 | 版本号或CAS | 低并发竞争 |
4. 避免死锁
九、MySQL性能优化
1. SQL优化手段
- 索引优化:合理添加索引,避免频繁更新字段加索引。
- 避免全表扫描:避免对索引列使用函数、NOT IN等。
- 查询优化:
- 使用
SELECT 字段
代替SELECT *
- 使用JOIN代替子查询
- 使用EXISTS代替IN
- 分库分表:数据量大时水平或垂直拆分。
- 批量操作:减少单条SQL执行次数。
2. EXPLAIN命令
- 分析SQL执行计划,判断是否走索引、是否存在全表扫描等。
3. 慢查询排查步骤
- 使用EXPLAIN分析执行计划。
- 检查是否使用索引。
- 优化查询语句,避免复杂子查询。
- 考虑分页、缓存等手段。
十、数据库缓存
1. 缓存的作用
- 将频繁访问的数据存入内存,减少磁盘I/O,提升查询速度。
2. MySQL缓存机制
- 查询缓存(Query Cache):
- 缓存SELECT语句及其结果集。
- 表更新后缓存失效。
- MySQL 8.0已移除。
- InnoDB缓冲池(Buffer Pool):
3. 应用层缓存
- Redis/Memcached:
- 作为外部缓存,存储热点数据。
- 减轻数据库压力,提升并发能力。
4. 缓存更新策略
- Cache-Aside:先查缓存,未命中则查数据库并写入缓存。
- Write-Through:同时更新缓存和数据库。
- Write-Behind:先更新缓存,异步更新数据库。
5. 缓存穿透、击穿、雪崩
- 穿透:查询不存在的数据,绕过缓存。
- 击穿:热点数据过期瞬间大量请求直达数据库。
- 雪崩:大量缓存同时失效,请求压垮数据库。
总结
MySQL作为最常用的关系型数据库之一,其核心知识点包括数据建模、索引优化、事务处理、锁机制、日志系统与性能调优等。合理使用缓存机制(如缓冲池、外部缓存)能显著提升系统性能。在实际开发中,应结合业务场景选择合适的存储引擎、索引策略和缓存方案,以达到高性能、高可用的目标。
本文基于MySQL 5.7/8.0 版本整理,部分特性可能随版本更新而变化。