【MySQL】高性能MySQL 阅读笔记

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

142082315_p0.png


高性能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) 收购。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇