MySQL 事务与锁

锁的类型

  • 行级锁:锁住一行数据,提高并发能力。
  • 表级锁:锁住整个表,适用于大批量操作。
  • 意向锁:表级别的标记,用于加速行锁检测。
  • 乐观锁:不加锁,依赖版本号控制并发更新。
  • 悲观锁:先锁后操作,适用于高并发竞争场景。

死锁的处理

  1. MySQL 死锁检测:自动回滚代价最小的事务。
  2. 手动 KILL 事务:手动终止长时间阻塞事务。
  3. 优化索引与 SQL 语句:减少锁冲突,降低死锁概率。

MySQL 读写分离与主从同步

  • 主从架构:主库处理写操作,从库处理读操作。
  • Binlog 实现主从同步
    1. 主库记录 Binlog。
    2. 从库读取 Binlog 并重放。
  • 避免主从同步延迟
    • 关键业务查询主库。
    • 二次查询策略(从库查不到再查主库)。

分库分表策略

水平拆分

  • 水平分表:将一张大表拆成多张小表(如 users_0, users_1)。
  • 水平分库:多个数据库存相同结构的表,降低单库压力。

垂直拆分

  • 垂直分表:将一张表的不同字段拆成多张表(如 user_baseuser_detail)。
  • 垂直分库:不同业务数据存入不同数据库(如 order_dbuser_db)。

分库分表的挑战

  • 跨库 JOIN 受限:需改为应用层查询或使用中间件(如 ShardingSphere)。
  • 事务一致性问题:需要分布式事务方案(如 TCC、最终一致性)。

MySQL 高可用架构

避免单点故障

  • 主从复制:单主多从架构,保证数据可用性。
  • MHA(MySQL High Availability):自动故障切换,支持主从切换。
  • PXC(Percona XtraDB Cluster):多主集群,保证高可用。

不停机数据迁移

  1. 双写方案
    • 代码层面双写:新旧库同步写入。
    • 业务低峰期停主从同步,开启双写。
    • 逐步灰度切流,保证数据一致。
  2. Flink CDC 方案
    • 监听 Binlog 变更,实时同步数据。

MySQL 存储与性能优化

WAL(Write-Ahead Logging)

  • 先写日志再写数据,确保数据持久化。
  • 降低磁盘 IO,提高事务吞吐量。

Doublewrite Buffer

  • 防止数据写入失败,避免数据损坏。

MySQL 缓存优化

  • Buffer Pool:缓存常用数据,减少磁盘 IO。
  • Query Cache(已废弃):缓存查询结果,减少 SQL 解析时间。

MySQL 其他高级特性

存在性查询:EXISTS vs. IN

  • EXISTS:适用于大数据集合,只关心是否存在。
  • IN:适用于小数据集合,直接匹配筛选。

存储过程

  • 优点:封装逻辑,提高性能。
  • 缺点
    • 可移植性差,不同数据库的 SQL 语法可能不兼容。
    • 调试困难,不利于代码管理(阿里开发手册不推荐)。