核心用法
MySQL技能聚焦于生产环境中高频出现的陷阱与优化点,涵盖以下关键维度:
字符集与排序规则
- 强制使用
utf8mb4替代残缺的utf8(3字节无法存储emoji) - 注意
utf8mb4_unicode_ci(不区分大小写)与utf8mb4_bin(字节精确匹配)的场景选择 - JOIN时核对collation一致性,避免隐式转换拖垮性能
索引策略
- 无部分索引支持,需用生成列模拟表达式索引(8.0.13+原生支持)
- TEXT/BLOB必须指定前缀长度:
INDEX (col(100)) - 覆盖索引通过多列组合实现,无PostgreSQL的INCLUDE语法
- 外键仅在InnoDB自动创建索引
并发与锁定
SELECT ... FOR UPDATE配合InnoDB的next-key locking机制,可能产生超出预期的gap lock- 默认50秒锁等待超时,MySQL 8+支持
SKIP LOCKED队列模式 - 死锁是预期行为,应用层需设计重试逻辑
数据操作模式
INSERT ... ON DUPLICATE KEY UPDATE实现UPSERT,依赖唯一键冲突REPLACE INTO实为DELETE+INSERT,会破坏自增ID并触发级联删除- 无
RETURNING语法,依赖LAST_INSERT_ID()获取自增值
查询与兼容性
LIMIT offset, count语法顺序与PostgreSQL相反ONLY_FULL_GROUP_BY模式从5.7起默认启用,非聚合列必须入GROUP BY- 布尔类型实为
TINYINT(1),TRUE/FALSE仅为1/0别名
运维要点
- 连接池需监控
wait_timeout(默认8小时)与max_connections(默认151) - 主从复制优先用Row-based模式,读副本必须检查
Seconds_Behind_Master - 8.0.18+才支持
EXPLAIN ANALYZE,旧版本仅能看到估算计划
显著优点
- 直击MySQL与PostgreSQL的行为差异,迁移成本低
- 覆盖InnoDB核心机制(事务、MVCC、锁),原理与实战并重
- 提供具体参数与工具(pt-online-schema-change),可立即落地
潜在局限
- 未涉及MySQL 8.0新特性(窗口函数、CTE、JSON增强)的深度对比
- 缺乏云托管RDS(AWS Aurora、阿里云RDS)的特定优化建议
- 存储引擎分析仅对比InnoDB/MyISAM,未覆盖TokuDB、RocksDB等替代引擎
适合人群
- 从PostgreSQL迁移至MySQL的后端开发者
- 负责遗留系统升级(5.6→5.7→8.0)的DBA
- 需要优化高并发写入、规避死锁的互联网业务工程师
常规风险
| 风险点 | 说明 |
|--------|------|
| 字符集数据截断 | 误用`utf8`导致emoji存入失败 |
| 锁升级死锁 | gap lock范围过大引发连锁死锁 |
| 复制延迟误读 | 读副本未校验延迟导致脏读 |
| 连接池耗尽 | max_connections配置不当引发雪崩 |