MySQL 核心原理 + 生产高频问题全方位总结
【摘要】 mysql
MySQL 是当下互联网最主流的关系型数据库,几乎所有后端、运维、云原生岗位都必须熟练掌握。本文从核心架构、存储引擎、索引原理、事务锁、主从复制、生产故障六个维度,一站式梳理 MySQL 必备知识点,适合入门、面试、生产复盘。
一、MySQL 整体架构
MySQL 采用分层架构,从上到下分为四层:
-
连接层:处理客户端连接、权限验证、连接池管理,控制最大连接数
-
服务层(核心):SQL 解析、语法校验、优化器、查询缓存、日志记录
-
引擎层:真正负责数据读写,支持多引擎切换(InnoDB、MyISAM)
-
存储层:磁盘文件持久化、数据落地
日常优化、报错、性能问题,90% 都出在服务层 + 引擎层。
二、两大存储引擎区别(面试必考)
1、InnoDB(默认、生产必用)
-
支持事务、ACID、行锁、外键、MVCC
-
支持崩溃恢复、数据安全高
-
读写均衡,适合业务数据表
-
数据和索引统一存储在 ibd 文件
2、MyISAM(老旧、基本淘汰)
-
不支持事务、不支持行锁、崩溃无法恢复
-
只有表锁,并发写入极差
-
查询速度快,适合静态日志、历史归档表
三、索引原理与优化
MySQL 默认使用 B+ 树索引,特点:层高更低、查询稳定、适合范围查询。
1、普通索引分类
-
主键索引:聚簇索引,数据直接存在索引叶子节点
-
普通索引:二级索引,叶子节点存主键值
-
唯一索引:禁止重复值
-
联合索引:遵循最左匹配原则
2、索引失效高频场景
-
like 以 % 开头:
like '%test' -
索引列参与运算、函数
-
隐式类型转换(字符串和数字对比)
-
or 前后字段未全部建索引
-
违反最左匹配原则
3、优化万能工具
explain select 语句 查看是否命中索引、是否全表扫描四、事务与四大隔离级别
1、事务 ACID
原子性、一致性、隔离性、持久性
2、四大隔离级别(InnoDB 默认 RR)
-
读未提交:脏读、不可重复读、幻读全部存在
-
读已提交 RC:解决脏读,存在不可重复读、幻读
-
可重复读 RR(MySQL 默认):解决脏读、不可重复读,存在幻读
-
串行化:最高级别,全部解决,性能极差
五、锁机制(生产阻塞根源)
1、锁类型
-
表锁:锁住整张表,并发低(MyISAM)
-
行锁:只锁数据行,并发高(InnoDB)
-
间隙锁、临键锁:解决幻读问题
2、生产常见锁问题
-
Lock wait timeout:行锁等待超时,长事务未提交导致
-
Deadlock:两条事务互相抢占锁,更新顺序不一致导致
解决:拆分大事务、统一 SQL 更新顺序、减少行锁竞争
六、MySQL 主从复制(企业必备)
1、原理流程
-
主库开启 binlog,记录所有增删改操作
-
从库 IO 线程拉取主库 binlog
-
从库 SQL 线程回放日志,同步数据
2、两大经典故障
-
Slave_IO_Running: No:网络不通、账号密码错误、server-id 重复
-
Slave_SQL_Running: No:主键冲突、数据不一致、表不存在
3、主从延迟原因
主库写入量大、从库单线程回放、大事务、硬件性能不足
七、生产高频故障汇总(实战)
1、Too many connections 连接数爆满
原因:空闲连接不释放、连接池配置不合理
解决:调高 max_connections,缩短 wait_timeout
2、CPU 100% 爆满
99% 是慢 SQL:无索引、全表扫描、大事务
解决:开启慢查询日志、explain 优化 SQL、增加索引
3、无法远程连接
bind-address 限制、防火墙 3306 未放行、root 未授权 % 访问
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)