Skip to content

Commit 651a6db

Browse files
committed
docs: 更新文档
1 parent 4090bf9 commit 651a6db

File tree

91 files changed

+4264
-1666
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+4264
-1666
lines changed

README.md

+36-49
Original file line numberDiff line numberDiff line change
@@ -31,55 +31,36 @@
3131
> - 🔁 项目同步维护:[Github](https://github.com/dunwu/db-tutorial/) | [Gitee](https://gitee.com/turnon/db-tutorial/)
3232
> - 📖 电子书阅读:[Github Pages](https://dunwu.github.io/db-tutorial/) | [Gitee Pages](https://turnon.gitee.io/db-tutorial/)
3333
34-
## 分布式
35-
36-
### 分布式综合
37-
38-
- [分布式面试总结](https://dunwu.github.io/blog/pages/f9209d/)
39-
40-
### 分布式理论
41-
42-
- [分布式理论](https://dunwu.github.io/blog/pages/286bb3/) - 关键词:`拜占庭将军``CAP``BASE``错误的分布式假设`
43-
- [共识性算法 Paxos](https://dunwu.github.io/blog/pages/0276bb/) - 关键词:`共识性算法`
44-
- [共识性算法 Raft](https://dunwu.github.io/blog/pages/4907dc/) - 关键词:`共识性算法`
45-
- [分布式算法 Gossip](https://dunwu.github.io/blog/pages/71539a/) - 关键词:`数据传播`
46-
47-
### 分布式关键技术
48-
49-
- 集群
50-
- 复制
51-
- 分区
52-
- 选主
34+
## 数据库综合
5335

54-
#### 流量调度
36+
### 分布式存储原理
5537

56-
- [流量控制](https://dunwu.github.io/blog/pages/60bb6d/) - 关键词:`限流``熔断``降级``计数器法``时间窗口法``令牌桶法``漏桶法`
57-
- [负载均衡](https://dunwu.github.io/blog/pages/98a1c1/) - 关键词:`轮询``随机``最少连接``源地址哈希``一致性哈希``虚拟 hash 槽`
58-
- [服务路由](https://dunwu.github.io/blog/pages/3915e8/) - 关键词:`路由``条件路由``脚本路由``标签路由`
59-
- 服务网关
60-
- [分布式会话](https://dunwu.github.io/blog/pages/95e45f/) - 关键词:`粘性 Session``Session 复制共享``基于缓存的 session 共享`
38+
#### 分布式理论
6139

62-
#### 数据调度
40+
- [分布式一致性](https://dunwu.github.io/blog/pages/dac0e2/)
41+
- [深入剖析共识性算法 Paxos](https://dunwu.github.io/blog/pages/874539/)
42+
- [深入剖析共识性算法 Raft](https://dunwu.github.io/blog/pages/e40812/)
43+
- [分布式算法 Gossip](https://dunwu.github.io/blog/pages/d15993/)
6344

64-
- [数据缓存](https://dunwu.github.io/blog/pages/fd0aaa/) - 关键词:`进程内缓存``分布式缓存``缓存雪崩``缓存穿透``缓存击穿``缓存更新``缓存预热``缓存降级`
65-
- [读写分离](https://dunwu.github.io/blog/pages/3faf18/)
66-
- [分库分表](https://dunwu.github.io/blog/pages/e1046e/) - 关键词:`分片``路由``迁移``扩容``双写``聚合`
67-
- [分布式 ID](https://dunwu.github.io/blog/pages/3ae455/) - 关键词:`UUID``自增序列``雪花算法``Leaf`
68-
- [分布式事务](https://dunwu.github.io/blog/pages/e1881c/) - 关键词:`2PC``3PC``TCC``本地消息表``MQ 消息``SAGA`
69-
- [分布式锁](https://dunwu.github.io/blog/pages/40ac64/) - 关键词:`数据库``Redis``ZooKeeper``互斥``可重入``死锁``容错``自旋尝试`
45+
#### 分布式关键技术
7046

71-
#### 资源调度
47+
##### 流量调度
7248

73-
- 弹性伸缩
49+
- [流量控制](https://dunwu.github.io/blog/pages/282676/)
50+
- [负载均衡](https://dunwu.github.io/blog/pages/98a1c1/)
51+
- [服务路由](https://dunwu.github.io/blog/pages/d04ece/)
52+
- [分布式会话基本原理](https://dunwu.github.io/blog/pages/3e66c2/)
7453

75-
#### 服务治理
54+
##### 数据调度
7655

77-
- [服务注册和发现](https://dunwu.github.io/blog/pages/1a90aa/)
78-
- [服务容错](https://dunwu.github.io/blog/pages/e32c7e/)
79-
- 服务编排
80-
- 服务版本管理
56+
- [缓存基本原理](https://dunwu.github.io/blog/pages/471208/)
57+
- [读写分离基本原理](https://dunwu.github.io/blog/pages/7da6ca/)
58+
- [分库分表基本原理](https://dunwu.github.io/blog/pages/103382/)
59+
- [分布式 ID 基本原理](https://dunwu.github.io/blog/pages/0b2e59/)
60+
- [分布式事务基本原理](https://dunwu.github.io/blog/pages/910bad/)
61+
- [分布式锁基本原理](https://dunwu.github.io/blog/pages/69360c/)
8162

82-
## 数据库综合
63+
### 其他
8364

8465
- [Nosql 技术选型](docs/12.数据库/01.数据库综合/01.Nosql技术选型.md)
8566
- [数据结构与数据库索引](docs/12.数据库/01.数据库综合/02.数据结构与数据库索引.md)
@@ -94,11 +75,13 @@
9475

9576
> [关系型数据库](docs/12.数据库/03.关系型数据库) 整理主流关系型数据库知识点。
9677
97-
### 公共知识
78+
### 关系型数据库综合
9879

9980
- [关系型数据库面试总结](docs/12.数据库/03.关系型数据库/01.综合/01.关系型数据库面试.md) 💯
100-
- [SQL Cheat Sheet](docs/12.数据库/03.关系型数据库/01.综合/02.SqlCheatSheet.md) 是一个 SQL 入门教程。
101-
- [扩展 SQL](docs/12.数据库/03.关系型数据库/01.综合/03.扩展SQL.md) 是一个 SQL 入门教程。
81+
- [SQL 语法基础特性](docs/12.数据库/03.关系型数据库/01.综合/02.SQL语法基础特性.md)
82+
- [SQL 语法高级特性](docs/12.数据库/03.关系型数据库/01.综合/03.SQL语法高级特性.md)
83+
- [扩展 SQL](docs/12.数据库/03.关系型数据库/01.综合/03.扩展SQL.md)
84+
- [SQL Cheat Sheet](docs/12.数据库/03.关系型数据库/01.综合/99.SqlCheatSheet.md)
10285

10386
### Mysql
10487

@@ -161,12 +144,16 @@
161144

162145
### HBase
163146

164-
> [HBase](https://dunwu.github.io/bigdata-tutorial/hbase) 📚 因为常用于大数据项目,所以将其文档和源码整理在 [bigdata-tutorial](https://dunwu.github.io/bigdata-tutorial/) 项目中。
165-
166-
- [HBase 原理](https://github.com/dunwu/bigdata-tutorial/blob/master/docs/hbase/HBase原理.md)
167-
- [HBase 命令](https://github.com/dunwu/bigdata-tutorial/blob/master/docs/hbase/HBase命令.md)
168-
- [HBase 应用](https://github.com/dunwu/bigdata-tutorial/blob/master/docs/hbase/HBase应用.md)
169-
- [HBase 运维](https://github.com/dunwu/bigdata-tutorial/blob/master/docs/hbase/HBase运维.md)
147+
- [HBase 快速入门](docs/12.数据库/06.列式数据库/01.HBase/01.HBase快速入门.md)
148+
- [HBase 数据模型](docs/12.数据库/06.列式数据库/01.HBase/02.HBase数据模型.md)
149+
- [HBase Schema 设计](docs/12.数据库/06.列式数据库/01.HBase/03.HBaseSchema设计.md)
150+
- [HBase 架构](docs/12.数据库/06.列式数据库/01.HBase/04.HBase架构.md)
151+
- [HBase Java API 基础特性](docs/12.数据库/06.列式数据库/01.HBase/10.HBaseJavaApi基础特性.md)
152+
- [HBase Java API 高级特性之过滤器](docs/12.数据库/06.列式数据库/01.HBase/11.HBaseJavaApi高级特性之过滤器.md)
153+
- [HBase Java API 高级特性之协处理器](docs/12.数据库/06.列式数据库/01.HBase/12.HBaseJavaApi高级特性之协处理器.md)
154+
- [HBase Java API 其他高级特性](docs/12.数据库/06.列式数据库/01.HBase/13.HBaseJavaApi其他高级特性.md)
155+
- [HBase 运维](docs/12.数据库/06.列式数据库/01.HBase/21.HBase运维.md)
156+
- [HBase 命令](docs/12.数据库/06.列式数据库/01.HBase/22.HBase命令.md)
170157

171158
## 搜索引擎数据库
172159

docs/12.数据库/01.数据库综合/01.Nosql技术选型.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -386,4 +386,4 @@ Neo4j 中,存储节点时使用了”index-free adjacency”,即每个节点
386386

387387
## 参考资料
388388

389-
- [NoSQL 还是 SQL ?这一篇讲清楚](https://juejin.im/post/5b6d62ddf265da0f491bd200)
389+
- [NoSQL 还是 SQL ?这一篇讲清楚](https://juejin.im/post/5b6d62ddf265da0f491bd200)

docs/12.数据库/01.数据库综合/02.数据结构与数据库索引.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -214,4 +214,4 @@ LSM 树的这些特点,使得它相对于 B+ 树,在写入性能上有大幅
214214
- [数据结构与算法之美](https://time.geekbang.org/column/intro/100017301)
215215
- [检索技术核心 20 讲](https://time.geekbang.org/column/intro/100048401)
216216
- [Data Structures for Databases](https://www.cise.ufl.edu/~mschneid/Research/papers/HS05BoCh.pdf)
217-
- [Data Structures and Algorithms for Big Databases](https://people.csail.mit.edu/bradley/BenderKuszmaul-tutorial-xldb12.pdf)
217+
- [Data Structures and Algorithms for Big Databases](https://people.csail.mit.edu/bradley/BenderKuszmaul-tutorial-xldb12.pdf)

docs/12.数据库/01.数据库综合/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ hidden: true
2222

2323
## 🚪 传送
2424

25-
◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ 🎯 [钝悟的博客](https://dunwu.github.io/blog/)
25+
◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ 🎯 [钝悟的博客](https://dunwu.github.io/blog/)

docs/12.数据库/02.数据库中间件/01.Shardingsphere/01.ShardingSphere简介.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,4 @@ Apache ShardingSphere 是多接入端共同组成的生态圈。 通过混合使
9191
## 参考资料
9292

9393
- [shardingsphere Github](https://github.com/apache/incubator-shardingsphere)
94-
- [shardingsphere 官方文档](https://shardingsphere.apache.org/document/current/cn/overview/)
94+
- [shardingsphere 官方文档](https://shardingsphere.apache.org/document/current/cn/overview/)

docs/12.数据库/02.数据库中间件/01.Shardingsphere/02.ShardingSphereJdbc.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,4 @@ SQL 解析作为分库分表类产品的核心,其性能和兼容性是最重
137137

138138
### 执行引擎
139139

140-
### 归并引擎
140+
### 归并引擎

docs/12.数据库/02.数据库中间件/02.Flyway.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -501,4 +501,4 @@ Flyway 的功能主要围绕着 7 个基本命令:[Migrate](https://flywaydb.o
501501

502502
## :door: 传送门
503503

504-
| [钝悟的博客](https://dunwu.github.io/blog/) | [db-tutorial 首页](https://github.com/dunwu/db-tutorial) |
504+
| [钝悟的博客](https://dunwu.github.io/blog/) | [db-tutorial 首页](https://github.com/dunwu/db-tutorial) |

docs/12.数据库/02.数据库中间件/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@ hidden: true
3030

3131
## 🚪 传送
3232

33-
◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ 🎯 [钝悟的博客](https://dunwu.github.io/blog/)
33+
◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ 🎯 [钝悟的博客](https://dunwu.github.io/blog/)

docs/12.数据库/03.关系型数据库/01.综合/01.关系型数据库面试.md

+83-10
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ categories:
88
tags:
99
- 数据库
1010
- 关系型数据库
11+
- 面试
1112
permalink: /pages/9bb28f/
1213
---
1314

1415
# 关系型数据库面试
1516

16-
## 一、索引和约束
17+
## 索引和约束
1718

1819
### 什么是索引
1920

@@ -252,7 +253,7 @@ MySQL 会一直向右匹配直到遇到范围查询 `(>,<,BETWEEN,LIKE)` 就停
252253
- `FOREIGN KEY` - 在一个表中存在的另一个表的主键称此表的外键。用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
253254
- `CHECK` - 用于控制字段的值范围。
254255

255-
## 二、并发控制
256+
## 并发控制
256257

257258
### 乐观锁和悲观锁
258259

@@ -336,7 +337,7 @@ MVCC 不能解决幻读问题,**Next-Key 锁就是为了解决幻读问题**
336337

337338
当两个事务同时执行,一个锁住了主键索引,在等待其他相关索引。另一个锁定了非主键索引,在等待主键索引。这样就会发生死锁。发生死锁后,`InnoDB` 一般都可以检测到,并使一个事务释放锁回退,另一个获取锁完成事务。
338339

339-
## 三、事务
340+
## 事务
340341

341342
> 事务简单来说:**一个 Session 中所进行所有的操作,要么同时成功,要么同时失败**。具体来说,事务指的是满足 ACID 特性的一组操作,可以通过 `Commit` 提交一个事务,也可以使用 `Rollback` 进行回滚。
342343
@@ -441,7 +442,7 @@ T<sub>1</sub> 读取某个范围的数据,T<sub>2</sub> 在这个范围内插
441442
| 并发性能 | 无影响 | 严重衰退 | 略微衰退 |
442443
| 适合场景 | 业务方处理不一致 | 短事务 & 低并发 | 长事务 & 高并发 |
443444

444-
## 四、分库分表
445+
## 分库分表
445446

446447
### 什么是分库分表
447448

@@ -577,7 +578,7 @@ T<sub>1</sub> 读取某个范围的数据,T<sub>2</sub> 在这个范围内插
577578

578579
来自淘宝综合业务平台团队,它利用对 2 的倍数取余具有向前兼容的特性(如对 4 取余得 1 的数对 2 取余也是 1)来分配数据,避免了行级别的数据迁移,但是依然需要进行表级别的迁移,同时对扩容规模和分表数量都有限制。总得来说,这些方案都不是十分的理想,多多少少都存在一些缺点,这也从一个侧面反映出了 Sharding 扩容的难度。
579580

580-
## 五、集群
581+
## 集群
581582

582583
> 这个专题需要根据熟悉哪个数据库而定,但是主流、成熟的数据库都会实现一些基本功能,只是实现方式、策略上有所差异。由于本人较为熟悉 Mysql,所以下面主要介绍 Mysql 系统架构问题。
583584
@@ -609,7 +610,7 @@ MySQL 读写分离能提高性能的原因在于:
609610

610611
![img](https://raw.githubusercontent.com/dunwu/images/dev/cs/database/mysql/master-slave-proxy.png)
611612

612-
## 六、数据库优化
613+
## 数据库优化
613614

614615
数据库优化的路线一般为:SQL 优化、结构优化、配置优化、硬件优化。前两个方向一般是普通开发的考量点,而后两个方向一般是 DBA 的考量点。
615616

@@ -842,7 +843,7 @@ SQL 关键字尽量大写,如:Oracle 默认会将 SQL 语句中的关键字
842843

843844
数据库扩容、使用高配设备等等。核心就是一个字:钱。
844845

845-
## 七、数据库理论
846+
## 数据库理论
846847

847848
### 函数依赖
848849

@@ -960,7 +961,7 @@ Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门
960961
| 学院-1 | 院长-1 |
961962
| 学院-2 | 院长-2 |
962963

963-
## 八、Mysql 存储引擎
964+
## 存储引擎
964965

965966
Mysql 有多种存储引擎,**不同的存储引擎保存数据和索引的方式是不同的,但表的定义则是在 Mysql 服务层统一处理的**
966967

@@ -986,7 +987,7 @@ InnoDB 和 MyISAM 是目前使用的最多的两种 Mysql 存储引擎。
986987
- InnoDB 支持故障恢复。
987988
- MyISAM 不支持故障恢复。
988989

989-
## 九、数据库比较
990+
## 数据库比较
990991

991992
### 常见数据库比较
992993

@@ -1070,6 +1071,78 @@ where rr>5 and rr<=10;
10701071

10711072
> 数据类型对比表摘自 [SQL 通用数据类型](https://www.runoob.com/sql/sql-datatypes-general.html)[SQL 用于各种数据库的数据类型](https://www.runoob.com/sql/sql-datatypes.html)
10721073
1074+
## SQL FAQ
1075+
1076+
### SELECT COUNT(\*)、SELECT COUNT(1) 和 SELECT COUNT(具体字段) 性能有差别吗?
1077+
1078+
在 MySQL InnoDB 存储引擎中,`COUNT(*)``COUNT(1)` 都是对所有结果进行 `COUNT`。因此`COUNT(*)``COUNT(1)`本质上并没有区别,执行的复杂度都是 `O(N)`,也就是采用全表扫描,进行循环 + 计数的方式进行统计。
1079+
1080+
如果是 MySQL MyISAM 存储引擎,统计数据表的行数只需要`O(1)`的复杂度,这是因为每张 MyISAM 的数据表都有一个 meta 信息存储了`row_count`值,而一致性则由表级锁来保证。因为 InnoDB 支持事务,采用行级锁和 MVCC 机制,所以无法像 MyISAM 一样,只维护一个`row_count`变量,因此需要采用扫描全表,进行循环 + 计数的方式来完成统计。
1081+
1082+
需要注意的是,在实际执行中,`COUNT(*)``COUNT(1)`的执行时间可能略有差别,不过你还是可以把它俩的执行效率看成是相等的。
1083+
1084+
另外在 InnoDB 引擎中,如果采用`COUNT(*)``COUNT(1)`来统计数据行数,要尽量采用二级索引。因为主键采用的索引是聚簇索引,聚簇索引包含的信息多,明显会大于二级索引(非聚簇索引)。对于`COUNT(*)``COUNT(1)`来说,它们不需要查找具体的行,只是统计行数,系统会自动采用占用空间更小的二级索引来进行统计。
1085+
1086+
然而如果想要查找具体的行,那么采用主键索引的效率更高。如果有多个二级索引,会使用 key_len 小的二级索引进行扫描。当没有二级索引的时候,才会采用主键索引来进行统计。
1087+
1088+
这里我总结一下:
1089+
1090+
1. 一般情况下,三者执行的效率为 `COUNT(*)`= `COUNT(1)`> `COUNT(字段)`。我们尽量使用`COUNT(*)`,当然如果你要统计的是某个字段的非空数据行数,则另当别论,毕竟比较执行效率的前提是结果一样才可以。
1091+
2. 如果要统计`COUNT(*)`,尽量在数据表上建立二级索引,系统会自动采用`key_len`小的二级索引进行扫描,这样当我们使用`SELECT COUNT(*)`的时候效率就会提升,有时候可以提升几倍甚至更高。
1092+
1093+
> ——摘自[极客时间 - SQL 必知必会](https://time.geekbang.org/column/intro/192)
1094+
1095+
### ORDER BY 是对分的组排序还是对分组中的记录排序呢?
1096+
1097+
ORDER BY 就是对记录进行排序。如果你在 ORDER BY 前面用到了 GROUP BY,实际上这是一种分组的聚合方式,已经把一组的数据聚合成为了一条记录,再进行排序的时候,相当于对分的组进行了排序。
1098+
1099+
### SELECT 语句内部的执行步骤
1100+
1101+
一条完整的 SELECT 语句内部的执行顺序是这样的:
1102+
1103+
1. FROM 子句组装数据(包括通过 ON 进行连接);
1104+
2. WHERE 子句进行条件筛选;
1105+
3. GROUP BY 分组 ;
1106+
4. 使用聚集函数进行计算;
1107+
5. HAVING 筛选分组;
1108+
6. 计算所有的表达式;
1109+
7. SELECT 的字段;
1110+
8. ORDER BY 排序;
1111+
9. LIMIT 筛选。
1112+
1113+
> ——摘自[极客时间 - SQL 必知必会](https://time.geekbang.org/column/intro/192)
1114+
1115+
### 解哪种情况下应该使用 EXISTS,哪种情况应该用 IN
1116+
1117+
索引是个前提,其实选择与否还是要看表的大小。你可以将选择的标准理解为小表驱动大表。在这种方式下效率是最高的。
1118+
1119+
比如下面这样:
1120+
1121+
```
1122+
SELECT * FROM A WHERE cc IN (SELECT cc FROM B)
1123+
SELECT * FROM A WHERE EXISTS (SELECT cc FROM B WHERE B.cc=A.cc)
1124+
```
1125+
1126+
当 A 小于 B 时,用 EXISTS。因为 EXISTS 的实现,相当于外表循环,实现的逻辑类似于:
1127+
1128+
```
1129+
for i in A
1130+
for j in B
1131+
if j.cc == i.cc then ...
1132+
```
1133+
1134+
当 B 小于 A 时用 IN,因为实现的逻辑类似于:
1135+
1136+
```
1137+
for i in B
1138+
for j in A
1139+
if j.cc == i.cc then ...
1140+
```
1141+
1142+
哪个表小就用哪个表来驱动,A 表小就用 EXISTS,B 表小就用 IN。
1143+
1144+
> ——摘自[极客时间 - SQL 必知必会](https://time.geekbang.org/column/intro/192)
1145+
10731146
## 参考资料
10741147

10751148
- [数据库面试题(开发者必看)](https://juejin.im/post/5a9ca0d6518825555c1d1acd)
@@ -1081,4 +1154,4 @@ where rr>5 and rr<=10;
10811154
- [ShardingSphere 分布式事务](https://shardingsphere.apache.org/document/current/cn/features/transaction/)
10821155
- [mysql 和 oracle 的区别](https://zhuanlan.zhihu.com/p/39651803)
10831156
- [RUNOOB SQL 教程](https://www.runoob.com/sql/sql-tutorial.html)
1084-
- [如果有人问你数据库的原理,叫他看这篇文章](https://gameinstitute.qq.com/community/detail/107154)
1157+
- [如果有人问你数据库的原理,叫他看这篇文章](https://gameinstitute.qq.com/community/detail/107154)

0 commit comments

Comments
 (0)