中间件速查手册
关系型数据库 · mysql

MySQL

最主流的开源关系型数据库,业务数据的账本

关系型数据库GPL-2.0 / 商业版C++学习难度:中等

MySQL 是绝大多数业务系统的“最终真相”:订单、用户、账务最后都落在它这里。它的核心就三件事——索引让查询变快,事务让并发写入不乱,主从复制让数据不丢、读请求能分摊。面试和工作里的问题,八成也集中在这三件事上。

01

它解决什么问题

业务数据必须准确、不能丢、不能出现“钱扣了订单没生成”。同时还要支撑高并发读写,单机迟早扛不住。

真实场景:典型场景:订单表按用户 ID 建索引,查询走 B+ 树三层的 IO;下单用事务包住扣库存和写订单;主库写、从库读,主库挂了切从库。

02

核心概念

每个概念一句话 + 一个类比。点击卡片看更详细的解释。

03

数据流转动画

跟着步骤看一条数据从进入系统到被处理完的完整路径,可以暂停、重播和调速。

Flow animation

一条 SQL 从连接到落盘

应用UPDATE ...Server 层解析 / 优化 / 执行Buffer Pool内存页缓存磁盘 .ibd数据 + 索引binlog逻辑变更日志从库relay → apply

← 左右滑动查看完整流程图 →

01 / 05
1. 建立连接

应用从连接池取一条连接,认证后开始执行 SQL。

提示:重点看两层:Server 层负责“怎么查”,InnoDB 层负责“怎么存”。 悬停图中的节点可以看概念解释。

04

优劣势

短句说清适合什么、不适合什么,选型时先看这一栏。

适合什么
  • 事务和强一致,账务类场景的默认选择
  • 索引优化成熟,SQL 生态和工具链最全
  • 主从 + MHA/Orchestrator 高可用方案成熟
  • 人才储备多,出问题容易找到答案
不适合什么
  • 水平扩展难,分库分表要自己扛
  • 单表数据量大后 DDL 和查询都会变慢
  • 复杂 JSON、嵌套结构表达不自然
  • 高并发写入受单机上限约束
05

常见使用场景

每个场景都配一句「为什么用它」。

01

交易与订单系统

订单、支付流水、库存扣减,全部放在事务里。

为什么用它:ACID 保证钱和单据不会对不上。

02

用户与权限数据

用户表、角色表、权限关联表,强关系查询。

为什么用它:多表 JOIN 和唯一约束是关系库的强项。

03

报表与统计查询

按时间、维度做聚合统计。

为什么用它:SQL 表达力强,配合索引和物化表够用。

06

同类对比

和同赛道的组件并排看,差异一目了然。

MySQLMongoDB

多数公司是混用:交易数据在 MySQL,商品详情和日志在 MongoDB。别为了「不用改表」把账务数据放进文档库。

打开对比页
07

常见问题

上手第一个月最容易卡住的地方。

Q1索引失效的常见场景?

对索引列做函数或运算、隐式类型转换(字符串列传数字)、前导模糊 LIKE '%x'、OR 连接的列没都建索引、联合索引不满足最左前缀、优化器判断全表更快。

Q2事务隔离级别有什么区别?

读未提交会脏读;读已提交解决脏读但有不可重复读;可重复读(MySQL 默认)解决不可重复读,靠 MVCC 大部分场景避免幻读;串行化全加锁,性能最差。

Q3为什么 MySQL 用 B+ 树不用 B 树或红黑树?

B+ 树非叶子节点只存键,一页能放更多索引项,树更矮(三层可存两千万行);叶子节点用链表相连,范围查询顺序扫描很快。红黑树高度太高,磁盘 IO 次数多。

Q4深分页 limit 1000000,10 为什么慢?

要扫描并丢弃前一百万行。优化方式:用上次的最大 id 做游标(where id > lastId limit 10),或先查主键再回表。

Q5主从延迟怎么处理?

写后立即读的场景强制走主库;用半同步复制减少延迟;从库并行重放(MTS);业务上做补偿查询。延迟大到无法接受时,考虑分片或换存储。