From cc8d4aa0557a72cdcd018a5358c22b109a770db2 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Sun, 25 Oct 2026 18:52:00 +0800 Subject: [PATCH] Update MySQL.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按 MySQL 8.0 手册更新:复制线程名称为 binlog dump 线程,DATETIME 自 5.6.4 起占 5 字节,TIMESTAMP 的默认值行为和选型说明,补充 InnoDB 支持空间索引;文字校对,参考书作者名补空格。 --- notes/MySQL.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/notes/MySQL.md b/notes/MySQL.md index c02ec69c..56290799 100644 --- a/notes/MySQL.md +++ b/notes/MySQL.md @@ -38,7 +38,7 @@ #### 1. 数据结构 -B Tree 指的是 Balance Tree,也就是平衡树。平衡树是一颗查找树,并且所有叶子节点位于同一层。 +B Tree 指的是 Balance Tree,也就是平衡树。平衡树是一棵查找树,并且所有叶子节点位于同一层。 B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具有 B Tree 的平衡性,并且通过顺序访问指针来提高区间查询的性能。 @@ -64,7 +64,7 @@ B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具 操作系统一般将内存和磁盘分割成固定大小的块,每一块称为一页,内存与磁盘以页为单位交换数据。数据库系统将索引的一个节点的大小设置为页的大小,使得一次 I/O 就能完全载入一个节点。 -如果数据不在同一个磁盘块上,那么通常需要移动制动手臂进行寻道,而制动手臂因为其物理结构导致了移动效率低下,从而增加磁盘数据读取时间。B+ 树相对于红黑树有更低的树高,进行寻道的次数与树高成正比,在同一个磁盘块上进行访问只需要很短的磁盘旋转时间,所以 B+ 树更适合磁盘数据的读取。 +如果数据不在同一个磁盘块上,那么通常需要移动磁臂进行寻道,而磁臂因为其物理结构导致了移动效率低下,从而增加磁盘数据读取时间。B+ 树相对于红黑树有更低的树高,进行寻道的次数与树高成正比,在同一个磁盘块上进行访问只需要很短的磁盘旋转时间,所以 B+ 树更适合磁盘数据的读取。 (三)磁盘预读特性 @@ -115,7 +115,7 @@ InnoDB 存储引擎在 MySQL 5.6.4 版本中也开始支持全文索引。 #### 4. 空间数据索引 -MyISAM 存储引擎支持空间数据索引(R-Tree),可以用于地理数据存储。空间数据索引会从所有维度来索引数据,可以有效地使用任意维度来进行组合查询。 +MyISAM 存储引擎支持空间数据索引(R-Tree),可以用于地理数据存储。空间数据索引会从所有维度来索引数据,可以有效地使用任意维度来进行组合查询。目前 InnoDB 存储引擎也支持空间数据索引。 必须使用 GIS 相关的函数来维护数据。 @@ -310,7 +310,7 @@ INT(11) 中的数字只是规定了交互工具显示字符的个数,对于存 ### 浮点数 -FLOAT 和 DOUBLE 为浮点类型,DECIMAL 为高精度小数类型。CPU 原生支持浮点运算,但是不支持 DECIMAl 类型的计算,因此 DECIMAL 的计算比浮点类型需要更高的代价。 +FLOAT 和 DOUBLE 为浮点类型,DECIMAL 为高精度小数类型。CPU 原生支持浮点运算,但是不支持 DECIMAL 类型的计算,因此 DECIMAL 的计算比浮点类型需要更高的代价。 FLOAT、DOUBLE 和 DECIMAL 都可以指定列宽,例如 DECIMAL(18, 9) 表示总共 18 位,取 9 位存储小数部分,剩下 9 位存储整数部分。 @@ -328,7 +328,7 @@ MySQL 提供了两种相似的日期时间类型:DATETIME 和 TIMESTAMP。 #### 1. DATETIME -能够保存从 1000 年到 9999 年的日期和时间,精度为秒,使用 8 字节的存储空间。 +能够保存从 1000 年到 9999 年的日期和时间,精度为秒,使用 5 字节的存储空间(MySQL 5.6.4 之前为 8 字节)。 它与时区无关。 @@ -342,9 +342,9 @@ MySQL 提供了两种相似的日期时间类型:DATETIME 和 TIMESTAMP。 MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提供了 UNIX_TIMESTAMP() 函数把日期转换为 UNIX 时间戳。 -默认情况下,如果插入时没有指定 TIMESTAMP 列的值,会将这个值设置为当前时间。 +如果希望插入时没有指定 TIMESTAMP 列的值就设置为当前时间,需要显式声明 DEFAULT CURRENT_TIMESTAMP。MySQL 8.0 默认开启了 explicit_defaults_for_timestamp,不再自动为表中第一个 TIMESTAMP 列添加这个默认值。 -应该尽量使用 TIMESTAMP,因为它比 DATETIME 空间效率更高。 +TIMESTAMP 比 DATETIME 少占用 1 字节,但是只能表示到 2038 年,需要表示更大的时间范围时应当使用 DATETIME。 ## 五、切分 @@ -352,7 +352,7 @@ MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提 水平切分又称为 Sharding,它是将同一个表中的记录拆分到多个结构相同的表中。 -当一个表的数据不断增多时,Sharding 是必然的选择,它可以将数据分布到集群的不同节点上,从而缓存单个数据库的压力。 +当一个表的数据不断增多时,Sharding 是必然的选择,它可以将数据分布到集群的不同节点上,从而缓解单个数据库的压力。

@@ -390,9 +390,9 @@ MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提 ### 主从复制 -主要涉及三个线程:binlog 线程、I/O 线程和 SQL 线程。 +主要涉及三个线程:binlog dump 线程、I/O 线程和 SQL 线程。 -- **binlog 线程** :负责将主服务器上的数据更改写入二进制日志(Binary log)中。 +- **binlog dump 线程** :主服务器上的数据更改会写入二进制日志(Binary log),该线程负责把二进制日志的内容发送给从服务器。 - **I/O 线程** :负责从主服务器上读取二进制日志,并写入从服务器的中继日志(Relay log)。 - **SQL 线程** :负责读取中继日志,解析出主服务器已经执行的数据更改并在从服务器中重放(Replay)。 @@ -414,7 +414,7 @@ MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提 ## 参考资料 -- BaronScbwartz, PeterZaitsev, VadimTkacbenko, 等. 高性能 MySQL[M]. 电子工业出版社, 2013. +- Baron Schwartz, Peter Zaitsev, Vadim Tkachenko, 等. 高性能 MySQL[M]. 电子工业出版社, 2013. - 姜承尧. MySQL 技术内幕: InnoDB 存储引擎 [M]. 机械工业出版社, 2011. - [20+ 条 MySQL 性能优化的最佳经验](https://www.jfox.info/20-tiao-mysql-xing-nen-you-hua-de-zui-jia-jing-yan.html) - [服务端指南 数据存储篇 | MySQL(09) 分库与分表带来的分布式困境与应对之策](http://blog.720ui.com/2017/mysql_core_09_multi_db_table2/ "服务端指南 数据存储篇 | MySQL(09) 分库与分表带来的分布式困境与应对之策")