Skip to content

Commit a81bfb2

Browse files
committed
docs:分布式理论知识优化完善(改动很大)
1 parent 63fd517 commit a81bfb2

14 files changed

Lines changed: 655 additions & 148 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8](https://docs.oracle.
329329
- [CAP 理论和 BASE 理论解读](https://javaguide.cn/distributed-system/protocol/cap-and-base-theorem.html)
330330
- [Paxos 算法解读](https://javaguide.cn/distributed-system/protocol/paxos-algorithm.html)
331331
- [Raft 算法解读](https://javaguide.cn/distributed-system/protocol/raft-algorithm.html)
332-
- [Gossip 协议详解](https://javaguide.cn/distributed-system/protocol/gossip-protocl.html)
332+
- [Gossip 协议详解](https://javaguide.cn/distributed-system/protocol/gossip-protocol.html)
333333
- [一致性哈希算法详解](https://javaguide.cn/distributed-system/protocol/consistent-hashing.html)
334334

335335
### RPC

README_EN.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ Recommended to read through online reading platforms for better experience and f
6464
- [ArrayList Core Source Code + Expansion Mechanism Analysis](./docs/java/collection/arraylist-source-code.md)
6565
- [LinkedList Core Source Code Analysis](./docs/java/collection/linkedlist-source-code.md)
6666
- [HashMap Core Source Code + Underlying Data Structure Analysis](./docs/java/collection/hashmap-source-code.md)
67+
6768
# Java Collection & Concurrency Series
6869

6970
## Collection
@@ -128,6 +129,7 @@ The JVM part mainly refers to the [JVM Specification - Java 8](https://docs.orac
128129
- [Java 18 New Features Overview](./docs/java/new-features/java18.md)
129130
- [Java 19 New Features Overview](./docs/java/new-features/java19.md)
130131
- [Java 20 New Features Overview](./docs/java/new-features/java20.md)
132+
131133
# Overview of Java 21, 22, 23, 24, and 25 New Features
132134

133135
## Computer Fundamentals
@@ -169,7 +171,7 @@ The JVM part mainly refers to the [JVM Specification - Java 8](https://docs.orac
169171
- [Linear Data Structures: Arrays, Linked Lists, Stacks, Queues](./docs/cs-basics/data-structure/linear-data-structure.md)
170172
- [Graphs](./docs/cs-basics/data-structure/graph.md)
171173
- [Heaps](./docs/cs-basics/data-structure/heap.md)
172-
- [Trees](./docs/cs-basics/data-structure/tree.md): Focus on [Red-Black Trees](./docs/cs-basics/data-structure/red-black-tree.md), B-, B+, B* Trees, and LSM Trees
174+
- [Trees](./docs/cs-basics/data-structure/tree.md): Focus on [Red-Black Trees](./docs/cs-basics/data-structure/red-black-tree.md), B-, B+, B\* Trees, and LSM Trees
173175

174176
Other Commonly Used Data Structures:
175177

@@ -205,6 +207,7 @@ Additionally, [GeeksforGeeks](https://www.geeksforgeeks.org/fundamentals-of-algo
205207
### MySQL
206208

207209
**Knowledge Points/Interview Questions Summary:**
210+
208211
# MySQL Common Knowledge Points & Interview Questions Summary (Must-Read :+1:)
209212

210213
- [MySQL Common Knowledge Points & Interview Questions Summary](./docs/database/mysql/mysql-questions-01.md)
@@ -290,6 +293,7 @@ Additionally, [GeeksforGeeks](https://www.geeksforgeeks.org/fundamentals-of-algo
290293
#### Spring/SpringBoot (Must-Read :+1:)
291294

292295
**Knowledge Points/Interview Questions Summary**:
296+
293297
- [Summary of Common Spring Knowledge Points and Interview Questions](./docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md)
294298
- [Summary of Common SpringBoot Knowledge Points and Interview Questions](./docs/system-design/framework/spring/springboot-knowledge-and-questions-summary.md)
295299
- [Summary of Common Spring/SpringBoot Annotations](./docs/system-design/framework/spring/spring-common-annotations.md)
@@ -338,7 +342,7 @@ Additionally, [GeeksforGeeks](https://www.geeksforgeeks.org/fundamentals-of-algo
338342
- [Interpretation of CAP Theory and BASE Theory](https://javaguide.cn/distributed-system/protocol/cap-and-base-theorem.html)
339343
- [Interpretation of Paxos Algorithm](https://javaguide.cn/distributed-system/protocol/paxos-algorithm.html)
340344
- [Interpretation of Raft Algorithm](https://javaguide.cn/distributed-system/protocol/raft-algorithm.html)
341-
- [Detailed Explanation of Gossip Protocol](https://javaguide.cn/distributed-system/protocol/gossip-protocl.html)
345+
- [Detailed Explanation of Gossip Protocol](https://javaguide.cn/distributed-system/protocol/gossip-protocol.html)
342346
- [Detailed Explanation of Consistent Hashing Algorithm](https://javaguide.cn/distributed-system/protocol/consistent-hashing.html)
343347

344348
### RPC
@@ -364,6 +368,7 @@ Additionally, [GeeksforGeeks](https://www.geeksforgeeks.org/fundamentals-of-algo
364368
- [Design Guide for Distributed ID](https://javaguide.cn/distributed-system/distributed-id-design.html)
365369

366370
### Distributed Lock
371+
367372
# Distributed Locks
368373

369374
- [Introduction to Distributed Locks](https://javaguide.cn/distributed-system/distributed-lock.html)
@@ -443,4 +448,4 @@ Deploying multiple instances of the same service to avoid single point of failur
443448

444449
If you want to stay up-to-date with my latest articles and share my valuable content, you can follow my official public account.
445450

446-
![JavaGuide Official Public Account](https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png)
451+
![JavaGuide Official Public Account](https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png)

docs/.vuepress/sidebar/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ export default sidebar({
465465
"cap-and-base-theorem",
466466
"paxos-algorithm",
467467
"raft-algorithm",
468-
"gossip-protocl",
468+
"gossip-protocol",
469469
"consistent-hashing",
470470
],
471471
},

docs/database/mysql/mysql-index.md

Lines changed: 103 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ ALTER TABLE `cus_order` ADD INDEX id_score_name(score, name);
365365

366366
最左前缀匹配原则指的是在使用联合索引时,MySQL 会根据索引中的字段顺序,从左到右依次匹配查询条件中的字段。如果查询条件与索引中的最左侧字段相匹配,那么 MySQL 就会使用索引来过滤数据,这样可以提高查询效率。
367367

368-
最左匹配原则会一直向右匹配,直到遇到范围查询(如 >、<)为止。对于 >=、<=、BETWEEN 以及前缀匹配 LIKE 的范围查询,不会停止匹配(相关阅读:[联合索引的最左匹配原则全网都在说的一个错误结论](https://mp.weixin.qq.com/s/8qemhRg5MgXs1So5YCv0fQ)
368+
最左匹配原则会一直向右匹配,直到遇到范围查询(如 >、<)为止。对于 >=、<=、BETWEEN 以及前缀匹配 LIKE 的范围查询,不会停止匹配。
369369

370370
假设有一个联合索引 `(column1, column2, column3)`,其从左到右的所有前缀为 `(column1)``(column1, column2)``(column1, column2, column3)`(创建 1 个联合索引相当于创建了 3 个索引),包含这些列的所有查询都会走索引而不会全表扫描。
371371

@@ -476,6 +476,108 @@ MySQL 可以简单分为 Server 层和存储引擎层这两层。Server 层处
476476
- **频繁需要排序的字段**:索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。
477477
- **被经常频繁用于连接的字段**:经常用于连接的字段可能是一些外键列,对于外键列并不一定要建立外键,只是说该列涉及到表与表的关系。对于频繁被连接查询的字段,可以考虑建立索引,提高多表连接查询的效率。
478478

479+
### 避免索引失效
480+
481+
索引失效也是慢查询的主要原因之一,常见的导致索引失效的情况有下面这些:
482+
483+
**`SELECT *` 查询(成本权衡)**
484+
485+
- `SELECT *` **不会直接导致索引失效**。如果 `WHERE` 条件符合索引规则,索引依然会被使用。
486+
- 它会导致**回表成本增加**。如果查询需要的字段不在索引中(非覆盖索引),数据库需要拿着主键回聚簇索引查数据。当数据量较大时,优化器会对比“索引查找 + 回表”与“直接全表扫描”的成本,若前者成本过高,优化器会**主动放弃索引**选择全表扫描。
487+
- `SELECT *` 还会网络传输和数据处理的浪费。尽量只查询需要的字段,利用**覆盖索引**减少回表。
488+
489+
**违背最左前缀原则**
490+
491+
- 最左前缀匹配原则指的是在使用联合索引时,MySQL 会根据索引中的字段顺序,从左到右依次匹配查询条件中的字段。如果查询条件与索引中的最左侧字段相匹配,那么 MySQL 就会使用索引来过滤数据,这样可以提高查询效率。
492+
- 最左匹配原则会一直向右匹配,直到遇到范围查询(如 >、<)为止。对于 >=、<=、BETWEEN 以及前缀匹配 LIKE 的范围查询,不会停止匹配。
493+
- MySQL 8.0.13 版本引入了索引跳跃扫描(Index Skip Scan,简称 ISS),它可以在某些索引查询场景下提高查询效率。在没有 ISS 之前,不满足最左前缀匹配原则的联合索引查询中会执行全表扫描。而 ISS 允许 MySQL 在某些情况下避免全表扫描,即使查询条件不符合最左前缀。不过,这个功能比较鸡肋, 和 Oracle 中的没法比,MySQL 8.0.31 还报告了一个 bug:[Bug #109145 Using index for skip scan cause incorrect result](https://bugs.mysql.com/bug.php?id=109145)(后续版本已经修复)。个人建议知道有这个东西就好,不需要深究,实际项目也不一定能用上。
494+
495+
失效示例:
496+
497+
```sql
498+
-- 索引:(sname, s_code, address)
499+
WHERE s_code = 1; -- 跳过最左列 sname,失效
500+
WHERE sname = 'A' AND address = 'Shanghai'; -- 跳过中间列 s_code,仅 sname 走索引
501+
WHERE sname = 'A' AND s_code > 1 AND address = 'Shanghai'; -- 范围查询后,address 失效
502+
```
503+
504+
**在索引列上进行计算、函数或类型转换**
505+
506+
- 索引存储的是字段的**原始值**。对字段进行操作后,数据库无法利用索引树的有序性,只能全表扫描后计算。
507+
- MySQL 8.0 支持**函数索引**,可针对计算后的值建索引,但使用场景有限,首选还是优化 SQL 写法。
508+
509+
失效示例:
510+
511+
```sql
512+
WHERE height + 1 = 170; -- 对索引列进行计算
513+
WHERE DATE(create_time) = '2022-01-01'; -- 对索引列使用函数
514+
```
515+
516+
优化建议:
517+
518+
```sql
519+
WHERE height = 169; -- 将计算移到等号右边
520+
WHERE create_time BETWEEN '2022-01-01 00:00:00' AND '2022-01-01 23:59:59';
521+
```
522+
523+
**`LIKE` 模糊查询以通配符开头**
524+
525+
- `LIKE` 查询必须以具体字符开头才能利用索引有序性,例如 `WHERE sname LIKE 'Guide%'; `
526+
- 这是因为B+ 树是从左到右排序的。前缀通配符(`%`)破坏了有序性,无法定位起始点。
527+
528+
失效示例:
529+
530+
```sql
531+
WHERE sname LIKE '%Guide'; -- 前缀模糊,全表扫描
532+
WHERE sname LIKE '%Guide%'; -- 前后模糊,全表扫描
533+
```
534+
535+
**`OR` 连接条件使用不当**
536+
537+
- 如果 `OR` 两边的列中**有一列没有索引**,通常会导致整个查询放弃索引,走全表扫描。
538+
- 确保 `OR` 两边的列都建有索引,或改写为 `UNION ALL`
539+
540+
失效示例:
541+
542+
```sql
543+
-- 假设 sname 有索引,address 无索引
544+
WHERE sname = '学生 1' OR address = '上海'; -- 索引失效,全表扫描
545+
```
546+
547+
**`N` / `NOT IN` 使用不当**
548+
549+
- **`IN`**:当 `IN` 列表中的值太多(通常超过 200 个,由 `eq_range_index_dive_limit` 参数决定)或查询范围覆盖了太多行,会导致索引失效。
550+
- **`NOT IN`**:在大多数情况下会引发全表扫描,因为它需要证明“不属于”某个集合,这在 B+ 树中通常需要遍历所有叶子节点。
551+
552+
失效示例:
553+
554+
```sql
555+
WHERE s_code IN (1, 2, 3 ... 500); -- 列表过长可能失效
556+
WHERE s_code NOT IN (1, 2, 3); -- 通常失效
557+
```
558+
559+
**隐式类型转换**
560+
561+
这是开发中最隐蔽的坑,转换的方向决定了索引的生死。
562+
563+
- 字段类型为字符串,查询条件未加引号(如 `varchar` 字段查 `WHERE col = 123`);或字段类型为数字,查询条件加了引号且字符集不匹配。
564+
- MySQL 会自动进行类型转换,导致索引列值发生变化,无法匹配索引树。
565+
- 详细介绍:[MySQL隐式转换造成索引失效](https://javaguide.cn/database/mysql/index-invalidation-caused-by-implicit-conversion.html)
566+
567+
**`ORDER BY` 排序优化陷阱**
568+
569+
即使 `WHERE` 条件精准,如果 `ORDER BY` 处理不好,依然会出现慢查询。
570+
571+
- 如果查询走了索引 A,但排序要求字段 B,或者需要回表的数据量太大导致优化器放弃索引排序,就会触发 `Using filesort`(内存/磁盘排序)。
572+
- 利用**覆盖索引**同时满足 `WHERE``ORDER BY`。例如索引为 `(name, age)`,查询 `SELECT name, age FROM users WHERE name = 'A' ORDER BY age` 是极其高效的。
573+
574+
**最后,总结一个口诀**
575+
576+
- 全值匹配我最爱,最左前缀不能改。
577+
- 范围之后全失效,函数计算索引败。
578+
- 模糊首位莫加百分号,类型转换要避开。
579+
- OR 连接需谨慎,覆盖索引避回表。
580+
479581
### 被频繁更新的字段应该慎重建立索引
480582

481583
虽然索引能带来查询上的效率,但是维护索引的成本也是不小的。 如果一个字段不被经常查询,反而被经常修改,那么就更不应该在这种字段上建立索引了。
@@ -500,21 +602,6 @@ MySQL 可以简单分为 Server 层和存储引擎层这两层。Server 层处
500602

501603
前缀索引仅限于字符串类型,较普通索引会占用更小的空间,所以可以考虑使用前缀索引带替普通索引。
502604

503-
### 避免索引失效
504-
505-
索引失效也是慢查询的主要原因之一,常见的导致索引失效的情况有下面这些:
506-
507-
- ~~使用 `SELECT *` 进行查询;~~ `SELECT *` 不会直接导致索引失效(如果不走索引大概率是因为 where 查询范围过大导致的),但它可能会带来一些其他的性能问题比如造成网络传输和数据处理的浪费、无法使用索引覆盖;
508-
- 创建了组合索引,但查询条件未遵守最左匹配原则;
509-
- 在索引列上进行计算、函数、类型转换等操作;
510-
- 以 % 开头的 LIKE 查询比如 `LIKE '%abc';`
511-
- 查询条件中使用 OR,且 OR 的前后条件中有一个列没有索引,涉及的索引都不会被使用到;
512-
- IN 的取值范围较大时会导致索引失效,走全表扫描(NOT IN 和 IN 的失效场景相同);
513-
- 发生[隐式转换](https://javaguide.cn/database/mysql/index-invalidation-caused-by-implicit-conversion.html)
514-
- ……
515-
516-
推荐阅读这篇文章:[美团暑期实习一面:MySQl 索引失效的场景有哪些?](https://mp.weixin.qq.com/s/mwME3qukHBFul57WQLkOYg)
517-
518605
### 删除长期未使用的索引
519606

520607
删除长期未使用的索引,不用的索引的存在会造成不必要的性能损耗。

docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ ZooKeeper 将数据保存在内存中,性能是不错的。 在“读”多于
6060
- **原子性:** 所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群中所有的机器都成功应用了某一个事务,要么都没有应用。
6161
- **单一系统映像:** 无论客户端连到哪一个 ZooKeeper 服务器上,其看到的服务端数据模型都是一致的。
6262
- **可靠性:** 一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖。
63-
- **实时性:** 一旦数据发生变更,其他节点会实时感知到。每个客户端的系统视图都是最新的
63+
- **顺序一致性**:所有客户端看到的数据变更顺序是一致的,按照操作被提交的全局 FIFO 顺序进行更新。但这并不保证变更会立即传播到所有节点
6464
- **集群部署**:3~5 台(最好奇数台)机器就可以组成一个集群,每台机器都在内存保存了 ZooKeeper 的全部数据,机器之间互相通信同步数据,客户端连接任何一台机器都可以。
6565
- **高可用:**如果某台机器宕机,会保证数据不丢失。集群中挂掉不超过一半的机器,都能保证集群可用。比如 3 台机器可以挂 1 台,5 台机器可以挂 2 台。
6666

docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ tag:
1010
1111
## 什么是 ZooKeeper
1212

13-
`ZooKeeper``Yahoo` 开发,后来捐赠给了 `Apache` ,现已成为 `Apache` 顶级项目。`ZooKeeper` 是一个开源的分布式应用程序协调服务器,其为分布式系统提供一致性服务。其一致性是通过基于 `Paxos` 算法的 `ZAB` 协议完成的。其主要功能包括:配置维护、分布式同步、集群管理等。
13+
`ZooKeeper``Yahoo` 开发,后来捐赠给了 `Apache` ,现已成为 `Apache` 顶级项目。`ZooKeeper` 是一个开源的分布式应用程序协调服务器,其为分布式系统提供一致性服务。其一致性是通过专门为 ZooKeeper 设计的 **ZAB(ZooKeeper Atomic Broadcast)** 协议完成的。其主要功能包括:配置维护、分布式同步、集群管理等。
1414

1515
简单来说, `ZooKeeper` 是一个 **分布式协调服务框架** 。分布式?协调服务?这啥玩意?🤔🤔
1616

0 commit comments

Comments
 (0)