Skip to content

核心基础与操作

SQL语言

  • DDL (数据定义语言):用于定义和修改数据库对象结构,如 CREATE, ALTER, DROP。
  • DML (数据操作语言):用于操作数据本身,如 INSERT, UPDATE, DELETE。
  • DQL (数据查询语言):用于查询数据,主要是 SELECT 及其复杂的子句(WHERE, JOIN, GROUP BY, HAVING, ORDER BY, LIMIT)。
  • DCL (数据控制语言):用于管理权限和安全,如 GRANT, REVOKE。

数据库对象

包括数据库、表、索引、视图等。

  • 表设计:涉及数据类型(数值、字符串、时间)、列属性(NOT NULL, DEFAULT, AUTO_INCREMENT)和约束(主键、外键、唯一键)。
  • 索引:是提高查询效率的关键数据结构,默认使用B+Tree算法。理解聚簇索引与非聚簇索引的区别、最左前缀原则以及如何避免索引失效是优化查询的基石。

核心机制与原理

SQL执行过程

  1. 连接器:客户端通过连接器连接MySQL服务器,验证账号密码权限是否正确
  2. 缓存:查询缓存有则直接返回,无则进入分析器(MySQL8+废弃)
  3. 分析器:检测SQL语法是否正确,验证库表是否存在
  4. 优化器:优化SQL语句,判断要使用哪个索引、如何排序,生成最优的执行计划
  5. 执行器:执行语句,生成具体的计划树
  6. 返回结果:格式化结果返回给客户端

存储引擎

  • InnoDB:是默认且绝对主流的引擎。支持事务、行级锁、外键,使用MVCC支持高并发,具备崩溃恢复能力,适合绝大多数OLTP场景。
  • MyISAM:不支持事务和行级锁,但查询速度快,适合读多写少的静态数据场景。

索引

按存储架构

  • 聚簇索引:InnoDB特有,一个表只能有一个,主键自动成为聚簇索引
  • 非聚簇索引:包涵普通索引和唯一非主键索引

按数据结构

  • B-Tree索引:最常见的索引类型,使用全键值、键值范围和键值前缀检索
  • Hash索引:按照Hash值划分
  • 全文索引:全文搜索
  • 空间索引:地理数据

按功能划分

  • 主键索引:主键唯一且只能有一个、不能为空
  • 唯一索引:唯一可以有多个,可以为空
  • 复合索引:多个列组合的索引
  • 前缀索引:只索引字段的前面部分字符
  • 普通索引:最基本的索引,无特殊限制

事务

  • 原子性 (Atomicity): 事务是不可分割的工作单位,事务中的操作要么全部成功,要么全部失败回滚

  • 一致性 (Consistency): 事务执行前后,数据库从一个一致状态变到另一个一致状态

  • 隔离性 (Isolation): 多个事务并发执行时,一个事务的执行不应影响其他事务

    • 读未提交
    • 读已提交
    • 可重复读
    • 串行化
  • 持久性 (Durability): 事务一旦提交,其结果就是永久性的

锁机制

保证并发操作的数据一致性。

按锁粒度分类

  • 全局锁:锁住整个MySQL实例
  • 表锁:锁住单张表
  • 行锁:锁住具体的数据行

按锁模式分类

  • 共享锁(S) - 读锁,多个事务可同时持有
  • 排他锁(X) - 写锁,只能一个事务持有

按实现算法分类

  • 记录锁 - 锁定索引记录
  • 间隙锁 - 锁定索引记录间的空隙
  • Next-Key锁 - 记录锁+间隙锁

死锁

死锁形成

  • 事务A持有id=1锁,等待id=2锁
  • 事务B持有id=2锁,等待id=1锁
  • MySQL检测到死锁,自动回滚其中一个事务

日志系统

错误日志(Error Log)

记录服务器启动、运行和关闭过程中的错误、警告和关键事件

查询日志(General Query Log)

记录所有客户端发送到服务器的查询语句,无论这些查询是否成功执行,生产环境建议关闭

慢查询日志(Slow Query Log)

记录执行时间超过阈值的查询语句,慢查询日志默认关闭,需要手动配置开启,不建议长期开启

二进制日志(Binary Log)

记录所有更改数据库数据的DDL和DML语句(不包括SELECT、SHOW等查询语句),用于数据恢复和复制

事务日志(Transaction Log)

重做日志(Redo Log)

重做日志(redo log)是InnoDB存储引擎特有的物理日志,记录事务提交时数据页的物理修改,主要功能是保证事务的持久性和数据库的崩溃恢复能力。

回滚日志(Undo Log)

回滚日志(undo log)用于记录数据被修改前的信息

  • 当delete一条数据时,会插入一条对应的insert记录到undo log
  • 当update一条记录时,会插入一条相反的update记录到undo log

中继日志(Relay Log)

中继日志(relay log)是主从复制过程中从服务器(I/O线程)使用的日志,记录了从主服务器接收的二进制日志事件

  • 由从服务器的I/O线程从主服务器读取并写入
  • 从服务器的SQL线程读取中继日志并执行其中的事件

运维管理

备份与恢复

按备份内容

  • 逻辑备份:使用 mysqldump 或 mydumper 导出SQL语句,灵活但恢复慢。
  • 物理备份:使用 XtraBackup 拷贝物理文件,速度快,适合大规模数据。

按备份方法

  • 热备:服务不停进行备份,对进行数据库操作无影响,但是对性能有影响
  • 冷备:停止服务进行备份,数据一致性和完整性高,但是服务不可用
  • 温备:数据库运行备份,但是只支持读操作,会阻塞写操作

按备份策略

  • 全备:对整个数据完全备份,操作简单,恢复完整,占用空间大
  • 增量备份:仅备份自上次备份(完全或增量)以来变化的数据,备份数据量小,占用空间小,备份速度快
  • 差异备份:备份自上次完全备份以来所有变化的数据,恢复只需最近一次完全备份和最后一次差异备份

监控与优化

  • 性能分析:使用 EXPLAIN 命令分析SQL语句的执行计划,是查询优化的首要步骤。
  • 压力测试:使用 mysqlslap 等工具模拟业务压力,评估数据库性能。

高可用与扩展架构

主从复制

复制原理

主库将数据变更写入Binlog,从库通过I/O线程获取并写入Relay Log,再由SQL线程重放,实现数据同步。

主从复制涉及两日志和三线程机制:

  • 二进制日志(Binlog):主库记录所有数据变更的日志文件
  • 中继日志(Relay Log):从库暂存从主库获取的二进制日志
  • 主库Dump 线程监听 Binlog 变化并发送给从库的 I/O 线程
  • 从库I/O 线程:请求主库的 Binlog 并写入 Relay Log
  • 从库SQL 线程:读取 Relay Log 并执行其中的 SQL 语句

复制模式

  • 异步复制(默认):主库执行完事务后立即返回,不等待从库确认
  • 半同步复制:主库至少等待一个从库接收并写入 Relay Log 后才返回
  • 组复制(Group Replication):基于 Paxos 协议的多主同步复制

高可用方案

MHA

经典的MySQL主从自动故障切换方案。 MHA是一套开源的 MySQL 高可用性解决方案,能够在主库发生故障时自动进行故障转移,将从库提升为新主库,从而保证 MySQL 服务的高可用性和可靠性 MHA Manager定期检查主节点的心跳信号,根据从库的复制位置(position/GTID)选择数据最接近原主库的从库晋升为主库。这种方案只适用于只支持一主多从,不支持多主写入

主主复制

  • 主主复制架构原理就是两台MySQL互为主从A主B,B主A实现主主复制,多节点也是同样的原理。

  • 在MySQl之上使用Haproxy做MySQL的主备切换或读写分离,当MySQL主故障会自动转发流量到备库

  • 在Haproxy之上利用Keepalived漂移VIP方案做Haproxy的高可用