高性能 MySQL 实战
此系列教程已全部更新完毕,通过本系列教程的学习,你可以深入了解 MySQL 底层的算法、实现和原理,进而通过实战篇的演练洞察如何对 MySQL 查询进行优化、如何对数据库操作进行备份和回撤、以及如何进行主从复制和读写分离,从而打造出高性能、高可用的 MySQL 集群。
你需要升级为订阅用户才能阅读所有教程内容,可以通过点击下面的按钮按照提示升级为订阅用户(已经是订阅用户忽略):
内容大纲如下:
整体架构
索引和查询优化
- 数据库索引底层数据结构 —— B+ 树
- 不同类型的数据库索引 B+ 树是如何维护的
- 花絮篇:B+ 索引树小结及数据表测试数据的快速填充
- 全值匹配查询时索引的使用与最左前缀原则的底层原理
- 范围匹配查询时索引的使用和 explain 结果字段解析
- 带分页、排序和分组统计的查询如何使用索引进行优化
- 内外连接查询的底层原理及如何使用索引进行性能优化
- 子查询的底层执行策略及如何使用索引进行性能优化
- 结合 PHP 业务代码高效获取数据表随机排序结果
查询小技巧分享:对于
count
聚合查询,有同学可能会好奇到底使用count(*)
还是count(id)
查询性能好一些,对于 InnoDB 引擎而言,MySQL 专门对count(*)
做了优化,而count(id)
则会进行全表扫描,再逐行累加,因此推荐使用count(*)
。有人可能会困惑,为啥 InnoDB 不像 MyISAM 那样把全表记录数记录下来,因为 InnoDB 支持事务,而事务里面有个 MVCC 机制(下面的事务篇里面会详细介绍),每条记录可能同时存在多个版本,因此,具体有多少行是不确定的。另外,对于经常需要计数的表字段,我们在设计数据表时会基于反范式设计通过冗余字段来存储,比如文章浏览数、视频观看数、商品购买数等,或者通过缓存系统来保存,这些手段都是为了提升查询性能。
数据库事务篇
注:以下事务篇教程仅限 InnoDB 引擎。
- 增删改查绕不过的坎儿 —— Buffer Pool
- MySQL 数据库事务简介与 ACID 特性
- 通过 redo 日志保证数据库事务的持久性
- 通过 undo 日志保证数据库事务的原子性
- 并发事务存在的问题和 MySQL 事务隔离级别
- 通过 MVCC 机制保证数据库事务的一致性
- MySQL 中的全局锁、表锁和行锁(共享锁、排它锁、意向锁、死锁)
- 悲观锁、乐观锁和数据库事务隔离性的实现
MySQL 事务如何在可重复读级别解决幻读问题:我们知道 InnoDB 支持行锁,在更新(修改/删除)某一行之前可以先通过行锁进行加锁操作,但是对于插入操作而言,事先插入的行是不存在的,也就无法加行锁,为此 MySQL 引入了一个间隙锁(Gap Lock)的概念,即对待插入的行与行之间的间隙进行加锁(两端是(-∞,MIN) 和 (MAX,+∞)),一个相邻的间隙锁和行锁合起来形成一个 Next-key Lock,它是一个前开后闭的区间(间隙锁+行锁),Next-key Lock 是 MySQL 加锁的基本单位,并且查询过程中访问到的对象才会加锁,如果一个 SQL 加锁语句查询条件包含唯一索引(包括主键)的等值查询,则该锁退化为行锁,因此对于一个插入语句而言,由于设置了 Next-key Lock,因此可以阻塞其他事务对对应行和间隙的读操作,从而避免了幻读问题。
数据库高可用篇
- 慢查询导致的线上数据库突发性能问题解决方案
- 高负载导致的线上数据库突发性能问题解决方案及 PHP 数据库长连接初探
- binlog 写入机制及高并发写入事务性能优化
- MySQL 主从复制原理 & 基于 Docker 搭建数据库集群
- binlog 日志查看、格式介绍与最佳选择
- 基于 GTID 配置主从复制并在 Laravel 项目中实现数据库读写分离
- 如何解决主从延迟问题(上)—— 主从延迟原因和优化方案
- 如何解决主从延迟问题(下)—— 读写分离的延迟和解决方案
- 通过主备切换保证 MySQL 数据库集群的高可用性
- 通过 Docker 编排 Mycat 中间件实现业务的读写分离和主备热切换(基于 Laravel 项目演示)
运维小技巧分享之删库不一定要跑路篇:binlog 日志除了用作数据库高可用集群构建之外,还可以用来恢复误删除的数据,如果误删除的是某个数据行的话,可以使用 Flashback 工具结合日志格式为 ROW 的 binlog 来恢复对应数据;如果误删除的是数据库/表的话,可以基于全量备份(定时备份的整个数据库数据)+增量备份(binlog)恢复对应数据;如果误删除的是整个数据库实例的话(通过 rm 之类的磁盘文件删除命令),如果已经基于 binlog 构建了数据库集群的话,这个最不用担心,只需摘除这个节点然后将其他节点数据同步过来即可。
实战优化篇(免费)
注:以下实战优化篇以 Laravel 模型类数据库操作为例进行演示
- 测量数据库性能指标(内存使用和查询耗时)
- 关联查询性能优化入门(索引、渴求式加载、指定查询字段)
- 聚合查询性能优化(减少查询次数)
- 通过子查询优化关联查询性能(通过子查询创建动态关联关系)
- 通过函数索引和虚拟生成列优化模糊匹配查询
- 通过子查询和联合查询结合关联查询进行模糊匹配
- 关联查询排序实现和性能优化(上):一对一和归属关联
- 关联查询排序实现和性能优化(下):一对多关联排序
日常数据库优化建议:通过高级的数据库设计让 SQL 查询语句变得简单易优化,而不是堆砌复杂的难以优化的 SQL 语句才能获取到数据。
32 条评论
nginx的快要开始了吗,还有mq的有规划吗
下个月开始更新 Nginx, MQ 这里有一个系列教程,还没有开始更新:Laravel 消息队列实战系列