MySQL 数据库核心知识点详解

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. 慢查询排查步骤

  1. 使用EXPLAIN分析执行计划。
  2. 检查是否使用索引。
  3. 优化查询语句,避免复杂子查询。
  4. 考虑分页、缓存等手段。

十、数据库缓存

1. 缓存的作用

  • 将频繁访问的数据存入内存,减少磁盘I/O,提升查询速度。

2. MySQL缓存机制

  • 查询缓存(Query Cache)
    • 缓存SELECT语句及其结果集。
    • 表更新后缓存失效。
    • MySQL 8.0已移除。
  • InnoDB缓冲池(Buffer Pool)
    • 缓存数据页和索引页。
    • 通过LRU算法管理内存。

3. 应用层缓存

  • Redis/Memcached
    • 作为外部缓存,存储热点数据。
    • 减轻数据库压力,提升并发能力。

4. 缓存更新策略

  • Cache-Aside:先查缓存,未命中则查数据库并写入缓存。
  • Write-Through:同时更新缓存和数据库。
  • Write-Behind:先更新缓存,异步更新数据库。

5. 缓存穿透、击穿、雪崩

  • 穿透 :查询不存在的数据,绕过缓存。
    • 解决方案:布隆过滤器、空值缓存。
  • 击穿 :热点数据过期瞬间大量请求直达数据库。
    • 解决方案:互斥锁、永不过期策略。
  • 雪崩 :大量缓存同时失效,请求压垮数据库。
    • 解决方案:设置随机过期时间、集群部署。

总结

MySQL作为最常用的关系型数据库之一,其核心知识点包括数据建模、索引优化、事务处理、锁机制、日志系统与性能调优等。合理使用缓存机制(如缓冲池、外部缓存)能显著提升系统性能。在实际开发中,应结合业务场景选择合适的存储引擎、索引策略和缓存方案,以达到高性能、高可用的目标。

本文基于MySQL 5.7/8.0 版本整理,部分特性可能随版本更新而变化。

相关推荐
时序数据说4 小时前
时序数据库 IoTDB:支撑万亿级物联网设备的基石
大数据·数据库·物联网·时序数据库·iotdb
橙-极纪元4 小时前
11种数据库类型详解-第3种:时序数据库(TSDB)
数据库·时序数据库
摆个烂4 小时前
时序数据库深度解析:从基础概念到未来趋势
数据库·时序数据库
时序数据说4 小时前
哪些行业需要使用时序数据库?
大数据·数据库·物联网·时序数据库
开着拖拉机回家4 小时前
【MongoDB】mongoDB数据迁移
数据库·mongodb·nosql·数据库迁移·mongodump·mongorestore
木木子99994 小时前
MongoDB Integer
数据库·mongodb
Elastic 中国社区官方博客5 小时前
在 Elasticsearch 和 GCP 上的混合搜索和语义重排序
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
无敌最俊朗@5 小时前
Qt QPainter 绘图系统精通指南
数据库
xhbh6665 小时前
MySQL分库分表详解:从原理、策略到ShardingSphere中间件选型,避坑指南一篇就够了
数据库·mysql·mysql分库分表