⭐ ミクの日2026 / miku(pid:142082315 )⭐

高性能MySQL 阅读笔记
阅读前
虽然起因是为了针对面试,但还是想完整的学习下关于 MySQL 的知识。从只会写 sql 代码,到知道 MySQL 具体是个什么东西。
然后根据推荐,选择了《高性能MySQL》这本书,被评价为数据库相关工作者的必读书目。
这本书最新版是第四版,基于 mysql8.0 的,但图书馆没有。而第三版,基于 mysql5.x 的。这两个也是 MySQL 使用量最多的版本了,故这两版我都打算读一遍。
两版的 pdf 我都找到了,但第三版在图书馆有实体书,故就先阅读这本。
阅读中
第三版
前言
这本书的整体结构,前几章,概述(第一章),基准测试(第二章),问题分析方法(第三章),关于 MySQL 各方面的设计(4-6),优化(配置、硬件配置、复制、可扩展性、优化)(8-14),其他(16、附录)。
重点阅读前 6 章,有了初步的了解,之后的章节速读,能作为工具书查表就行。
第 1 章,MySQL 架构与历史
mermaid
mindmap
root((MySQL))
:::rootClass
架构
:::categoryClass
网路层
:::leafClass
连接、认证
线程
服务层
存储引擎
InnoDB
MyISAM
其他:Archieve、Memory、CSV、NDB
并发
:::categoryClass
锁
:::leafClass
写锁、读锁
锁粒度、锁策略:表锁、行锁
死锁
事务
ACID:原子性、一致性、隔离性、持久性
隔离级别:未提交读(脏读)、提交读、可重复读(幻读)、串行化
事务日志、AUOTOCOMMIT 模式
MVCC(多版本并发控制)、乐观锁、悲观锁
%% 样式定义
%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#e3f2fd', 'primaryTextColor': '#0d47a1', 'primaryBorderColor': '#1565c0', 'lineColor': '#1565c0', 'fontFamily': 'Arial' } } }%%
-
1.1:架构图:网络层,MySQL 服务层,存储引擎层
-
1.1.1:每个客户端连接都会分配一个线程。客户端连接时,会有安全认证[^3]。
-
1.1.2:MySQL 处理请求时,会先解析请求,并进行优化。explain 关键字[^1]。优化器。查询缓存。
-
1.2:并发
-
1.2.1:为解决并发问题:共享锁/读锁,排他锁/写锁。
-
1.2.2:锁粒度。锁策略^2:表锁,行锁,(页锁?)
-
1.3:事务。相关的 ACID 概念:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
-
1.3.1:隔离级别:未提交读(Read Uncommitted)(脏读)、提交读(Read Committed)、可重复读(Repeatable Read)(幻读)、可串行化(Serializable)。
存在两种查询,select * fome,与 update * where,前者属于快照读,后者属于当前读(再写),而在 RR 中,事务在第一次查询中建立快照,后续查询都基于这个快照进行,解决了不可重复读的问题,但是 update 的查询,仍然是在原数据中查询,故仍然存在幻读的问题。
解决方案是间隙锁,在当前读时锁住读取的间隙(区间,包含未有的数据)。
-
1.3.2:死锁。处理方法是将其中一个(代价小的)事务进行回滚。
-
1.3.3:事务日志。数据分为内存数据与磁盘数据,写操作会更改内存数据,后将操作记录写入事务日志中,事务日志存在硬盘中。
-
1.3.4:AUTOCOMMIT 模式。默认 ON,即每次请求都为一个独立的事务。否则所有请求都在一个事务内,需要主动 COMMIT(除了一些例外的命令,会在执行前强制 COMMIT,比如 ALTER TABLE)。
MySQL 服务层不管理事务,事务由下层的存储引擎实现。而常见的 InnoDB 支持事务,MyISAM 不支持事务。故在同一个事务中,不推荐涉及多个存储引擎。
隐式锁与显式锁。在同一事务中,前者由存储引擎(根据隔离级别)管理,后者可以在 SQL 中显式锁定。
- 1.4:多版本并发控制(MVCC,Multi-Version Concurrency Control),指的数据从一个一致性状态转到另一个一致性状态,这个状态的版本。可以说行级锁的变种,避免了很多加锁操作。简单的有乐观锁、悲观锁两种策略。
InnoDB 的 MVCC。
-
1.5:存储引擎,
SHOW TABLE STATUS。 -
1.5.1 – 1.5.4:
InnoDB。默认。事务型。聚簇索引。
MyISAM。非事务。奔溃后无法安全恢复。全文索引。MySIAM 压缩表。
Archive。仅支持 INSERT 和 SELECT。适合写多读少的业务。
CSV。可以理解为用 Excel(但不是) 作为数据载体。
Memory。仅放在内存中的表。
NDB。用于集群。
其他。比如面向列。
-
1.5.5:选择合适的存储引擎。考虑因素:事务、备份、奔溃、独有特性。
-
1.5.6:转换表引擎的方法:
ALTER TABLE、导出导入、INSERT与SELECT。 -
1.6 – 1.8:历史[^4]。开发模式(本体开源。扩展插件付费。)。总结
第 2 章,MySQL 基准测试
-
2.1:必要性
-
2.2:策略:集成式、单组件式
指标:吞吐量(TPS^5)、延迟、并发性、扩展性
-
2.3:方法:预热、热点数据、测试时长、默认配置
-
2.4:工具:Sysbench
-
2.5:案例
-
2.6:总结
看完啦(虽说看完与记录空档了小段时间)。评价是实践多于理论的一个章节。内容上,只是介绍了基准测试,与如何设计测试方案。而要真的掌握,得去实践一番才行,那么这就得出了一个课后作业:实践 Sysbench了,记录下。
第 3 章,服务器性能剖析
-
3.1:性能(完成某件任务所需要的时间度量)
-
3.1.1 – 3.1.2:通过性能剖析进行优化,分析工具 pt-query-digest
-
3.2:对应用程序进行性能剖析。
通过在程序中埋测量点,收集数据用于分析。一般各语言都有提供对应的工具能使用。虽然会不可避免的对服务产生影响,但在全局的优化层面,是值得的。
-
3.2.1:测量 PHP 应用程序方法。
-
3.3:剖析 MySQL 查询
-
3.3.1:剖析服务器负载、慢查询日志/分析
-
3.3.2:剖析单条查询:SHOW PROFILE(记录每条查询信息)、SHOW STATUS(获取计数器)、慢查询日志、Performance Schema。
-
3.3.3:使用性能剖析
-
3.4:诊断间歇性问题
-
3.4.1:收集数据方法:SHOW CLOBAL STATUS(计数器)、SHOW PROCESSLIST(线程状态)、查询日志。
-
3.4.2:分析数据,并诊断
-
3.4.3:案例
-
3.5 – 3.5.2:其他剖析工具:USER_STATISTICS 表、strace、
跟基准测试那章一样,实践多于理论的一章,全章更偏向于思路指导,帮你在面对优化课题时,从哪入手,又如何推进。
第 4 章,Schema与数据类型优化
- 4.1:选择数据类型,简单、更小、避免 NULL。
- 4.1.1:整数,TinyInt、SmallInt、MediumInt、Int、BigInt,8-64。Unsigned。
- 4.1.2:实数,Float、Double。Decimal。
- 4.1.3:字符串,Varchar、Char。Blob、Text。Enum。
- 4.1.4:日期,DateTime、TimeStamp。
- 4.1.5:位,Bit、Set。
- 4.1.6 – 4.1.7:标识列。特殊类型。
- 4.2:MySQL schema 设计陷阱,太多列、太多关联
- 4.3 – 4.3.3:范式与反范式,优缺点,混用。
- 4.4 – 4.4.2:缓存表、汇总表。物化视图。计数器表。
- 4.5:优化 Alter Table 操作,修改 .frm、快速创建 MyISAM 索引、
- 4.6:总结。
看完了,这章内容偏向于记忆性理论,以及一些实践。
第 5 章,创建高性能的索引
-
5.1:在索引中找到值,根据值找到数据行。多列索引,列顺序。
-
5.1.1:
B-Tree:全键、键值范围、键前缀、排序
哈希:Memory引擎,等值比较,哈希冲突,InnoDB的自适应哈希索引,自定义哈希索引(使用 B-Tree 模拟、维护)
空间数据(R-Tree)
全文索引
-
5.2:优点:减少扫描数据量、避免排序与临时表、将随机 I/O 变为顺序 I/O
-
5.3:创建和使用索引
-
5.3.1-4:独立列、索引的选择性、多列索引、索引列顺序
-
5.3.5:聚簇索引,InnoDB 底层的数据存储方式,数据页
-
5.3.6:覆盖索引,指不需要访问数据行,仅通过索引即可获得全部数据
-
5.3.7:使用索引进行排序
-
5.3.8:压缩索引(MyISAM)
-
5.3.9-10:冗余、重复、未使用索引
-
5.3.11:锁
-
5.4:案例
-
5.5:维护
-
5.6:总结
前 3 节还是认真看的,后面就跳过了。
阅读后
脚注
[^1]: explain 可以查看 sql 执行时是否有使用到索引,关联查询时可以查看 sql 的执行顺序。
[^3]: 用户名、主机信息、密码。也支持 SSL 。成功后,也会请求时验证用户权限。
[^4]: 先后被 Sun(5.1),Oracle(5.5) 收购。
