@@ -73,10 +73,10 @@ student(学号、课程号、姓名、学分、成绩)
7373
7474不符合 2NF 可能会存在的问题:
7575
76- - ** 数据冗余** - 每条记录都含有相同信息。
77- - ** 删除异常** - 删除所有学生成绩,就把课程信息全删除了。
78- - ** 插入异常** - 学生未选课,无法记录进数据库。
79- - ** 更新异常** - 调整课程学分,所有行都调整。
76+ - ** 数据冗余** : 每条记录都含有相同信息。
77+ - ** 删除异常** : 删除所有学生成绩,就把课程信息全删除了。
78+ - ** 插入异常** : 学生未选课,无法记录进数据库。
79+ - ** 更新异常** : 调整课程学分,所有行都调整。
8080
8181根据 2NF 可以拆分如下:
8282
@@ -246,8 +246,8 @@ EXISTS 和 IN 区别如下:
246246 - ` EXISTS ` 用于判断子查询的结果集是否为空。
247247 - ` IN ` 用于判断某个值是否在指定的集合中。
248248- ** 性能**
249- - ** ` EXISTS ` 先外后内** - 先对外表进行循环查询,再将查询结果放入 ` EXISTS ` 的子查询中进行条件比较,一旦找到匹配记录,则终止内表子查询。
250- - ** ` IN ` 先内后外** - 先查询内表,将内表的查询结果作为条件,提供给外表查询语句进行比较。
249+ - ** ` EXISTS ` 先外后内** : 先对外表进行循环查询,再将查询结果放入 ` EXISTS ` 的子查询中进行条件比较,一旦找到匹配记录,则终止内表子查询。
250+ - ** ` IN ` 先内后外** : 先查询内表,将内表的查询结果作为条件,提供给外表查询语句进行比较。
251251- ** 应用**
252252 - 如果查询的两个表大小相当,那么 ` EXISTS ` 和 ` IN ` 差别不大。
253253 - ` EXISTS ` 适合外表小而内表大的场景。
@@ -470,17 +470,17 @@ ALTER TABLE test CONVERT TO CHARSET utf8mb4;
470470
471471MySQL 内置了以下存储引擎:
472472
473- - ** InnoDB** - InnoDB 是 MySQL 5.5 版本以后的默认存储引擎。
473+ - ** InnoDB** : InnoDB 是 MySQL 5.5 版本以后的默认存储引擎。
474474 - 优点:支持** 事务** ,支持** 行级锁** ,支持** 外键约束** 等,** 并发性能不错** 且支持** 自动故障恢复** 。
475- - ** MyISAM** - MyISAM 是 MySQL 5.5 版本以前的默认存储引擎。
475+ - ** MyISAM** : MyISAM 是 MySQL 5.5 版本以前的默认存储引擎。
476476 - 优点:速度快,占用资源少。
477477 - 缺点:不支持事务,不支持行级锁,不支持外键约束,也不支持自动故障恢复功能。
478- - ** Memory** - 使用系统内存作为存储介质,以便得到更快的响应速度。不过,如果 mysqld 进程崩溃,则会导致所有的数据丢失。因此,Memory 引擎常用于临时表。
479- - ** NDB** - 也被称为 NDB Cluster 存储引擎,主要用于 MySQL Cluster 分布式集群环境,类似于 Oracle 的 RAC 集群。
480- - ** Archive** - Archive 存储引擎有很好的压缩机制,非常适合用于归档数据。
478+ - ** Memory** : 使用系统内存作为存储介质,以便得到更快的响应速度。不过,如果 mysqld 进程崩溃,则会导致所有的数据丢失。因此,Memory 引擎常用于临时表。
479+ - ** NDB** : 也被称为 NDB Cluster 存储引擎,主要用于 MySQL Cluster 分布式集群环境,类似于 Oracle 的 RAC 集群。
480+ - ** Archive** : Archive 存储引擎有很好的压缩机制,非常适合用于归档数据。
481481 - Archive 存储引擎只支持 ` INSERT ` 和 ` SELECT ` 操作。
482482 - Archive 存储引擎采用 zlib 算法压缩数据,压缩比可达到 1: 10。
483- - ** CSV** - 可以将 CSV 文件作为 MySQL 的表来处理,但这种表不支持索引。
483+ - ** CSV** : 可以将 CSV 文件作为 MySQL 的表来处理,但这种表不支持索引。
484484
485485![ ] ( https://raw.githubusercontent.com/dunwu/images/master/snap/202503210712752.png )
486486
@@ -704,9 +704,9 @@ MySQL 支持三种复制方式:同步、异步、半同步。下面是三种
704704
705705MySQL 异步复制可以分为三个步骤,分别由三个线程完成:
706706
707- - ** binlog dump 线程** - 主库接收事务请求,更新数据,并即时响应客户端(不等待从库)。主库上有一个特殊的 binlog dump 线程,负责将主服务器上的数据更改写入 binlog 中。
708- - ** I/O 线程** - 从库上有一个 I/O 线程,负责从主库上读取 binlog,并写入从库的中继日志(relay log)中。
709- - ** SQL 线程** - 从库上有一个 SQL 线程,负责重放中继日志(relay log),更新从库数据。
707+ - ** binlog dump 线程** : 主库接收事务请求,更新数据,并即时响应客户端(不等待从库)。主库上有一个特殊的 binlog dump 线程,负责将主服务器上的数据更改写入 binlog 中。
708+ - ** I/O 线程** : 从库上有一个 I/O 线程,负责从主库上读取 binlog,并写入从库的中继日志(relay log)中。
709+ - ** SQL 线程** : 从库上有一个 SQL 线程,负责重放中继日志(relay log),更新从库数据。
710710
711711![ ] ( https://raw.githubusercontent.com/dunwu/images/master/cs/database/mysql/master-slave.png )
712712
@@ -794,12 +794,12 @@ MySQL 5.7 引入了半同步复制:主库只需等待**至少 N 个从库**(
794794
795795MySQL 整个查询执行过程,总的来说分为 6 个步骤:
796796
797- 1 . ** 连接器** - 客户端和 MySQL 服务器建立连接;连接器负责跟客户端** 建立连接** 、** 获取权限** 、** 维持和管理连接** 。
798- 2 . ** 查询缓存** - MySQL 服务器首先检查查询缓存,如果命中缓存,则立刻返回结果。否则进入下一阶段。MySQL 缓存弊大于利,因为失效非常频繁——任何更新都会清空查询缓存。
799- 3 . ** 分析器** - MySQL 服务器进行 SQL 解析:** 语法分析** 、** 词法分析** 。
800- 4 . ** 优化器** - MySQL 服务器用优化器** 生成对应的执行计划** ,** 根据策略选择最优索引** 。
801- 5 . ** 执行器** - MySQL 服务器根据执行计划,调用存储引擎的 API 来** 执行查询** 。
802- 6 . ** 返回结果** - MySQL 服务器将结果返回给客户端,同时缓存查询结果。
797+ 1 . ** 连接器** : 客户端和 MySQL 服务器建立连接;连接器负责跟客户端** 建立连接** 、** 获取权限** 、** 维持和管理连接** 。
798+ 2 . ** 查询缓存** : MySQL 服务器首先检查查询缓存,如果命中缓存,则立刻返回结果。否则进入下一阶段。MySQL 缓存弊大于利,因为失效非常频繁——任何更新都会清空查询缓存。
799+ 3 . ** 分析器** : MySQL 服务器进行 SQL 解析:** 语法分析** 、** 词法分析** 。
800+ 4 . ** 优化器** : MySQL 服务器用优化器** 生成对应的执行计划** ,** 根据策略选择最优索引** 。
801+ 5 . ** 执行器** : MySQL 服务器根据执行计划,调用存储引擎的 API 来** 执行查询** 。
802+ 6 . ** 返回结果** : MySQL 服务器将结果返回给客户端,同时缓存查询结果。
803803
804804### 【困难】一条 SQL 更新语句是如何执行的?⭐⭐⭐
805805
@@ -1026,11 +1026,11 @@ possible_keys: PRIMARY
10261026
10271027** 执行计划关键字段**
10281028
1029- - ** ` type ` ** - 按性能从高到低排序:` system > const > eq_ref > ref > range > index > ALL ` 。目标应尽可能避免 ` ALL ` (全表扫描)。
1030- - ** ` possible_keys ` ** - 可能使用的索引。
1031- - ** ` key ` ** - 实际使用的索引。
1032- - ** ` rows ` ** - 预估需要检查的行数,值越小越好。
1033- - ** ` Extra ` ** - 包含重要补充信息。
1029+ - ** ` type ` ** : 按性能从高到低排序:` system > const > eq_ref > ref > range > index > ALL ` 。目标应尽可能避免 ` ALL ` (全表扫描)。
1030+ - ** ` possible_keys ` ** : 可能使用的索引。
1031+ - ** ` key ` ** : 实际使用的索引。
1032+ - ** ` rows ` ** : 预估需要检查的行数,值越小越好。
1033+ - ** ` Extra ` ** : 包含重要补充信息。
10341034
10351035** 执行计划分析步骤** :
10361036
0 commit comments