Skip to content

Commit 288e0e8

Browse files
committed
修改:部分文章排版
1 parent 603b225 commit 288e0e8

File tree

4 files changed

+68
-58
lines changed

4 files changed

+68
-58
lines changed

gitbook_doc/rdbms-learning/RDBMS常见知识点.md

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<!-- TOC -->
22

3-
* [RDBMS常见知识点](#rdbms常见知识点)
3+
* [RDBMS常见知识点](#rdbms常见知识点)
44
* [键是什么?](#键是什么)
55
* [超键 / 候选键 / 主键 / 外键?](#超键--候选键--主键--外键)
6-
* [联合主键和复合主键](#联合主键和复合主键)
6+
* [联合主键(复合主键)](#联合主键复合主键)
77
* [DDL,DML,DCL,DQL,TCL](#ddldmldcldqltcl)
88
* [DROP , TRUNCATE , DELETE区别](#drop--truncate--delete区别)
99
* [数据库设计范式(Normal Form)?](#数据库设计范式normal-form)
@@ -31,66 +31,56 @@
3131
班级表有: 班级id,班级名等属性.
3232
```
3333

34+
3435
#### 超键 / 候选键 / 主键 / 外键?
3536
* 超键: 超键是能唯一标识数据表中的记录的**属性集的集合**
3637
>超键可以是一个属性,也可以是属性组合。
3738
>如学生表中的学号可以作为学生的唯一标识,
3839
>身份证号也可以作为学生的唯一标识,那么与这2个属性任意搭配的集合,
3940
>都可以作为学生表的超键:
40-
>[[学号][身份证号],[学号,身份证号][学号,性别][身份证号,性别]...]等等。
41+
>{[学号][身份证号],[学号,身份证号][学号,性别][身份证号,性别]...}等等。
4142
4243
* 候选键: 候选键是能唯一标识数据表中的记录的**属性的集合。**
4344
>可以把候选键看作是最小粒度的超键,即没有冗余的超键。
44-
>学生表中的候选键为:[[学号][身份证号]]
45-
>但是不能有[学号,身份证号],因为学号和身份证号同时存在就不是最小粒度了。
45+
>学生表中的候选键可以为:{[学号][身份证号]}
46+
>但是不能为{[学号,身份证号]},因为学号和身份证号同时存在就不是最小粒度了。
4647
4748
* 主键: **主键是能唯一标识数据表中的记录的属性列。**
4849
>看起来主键和候选键区别不大。
49-
>但是候选键可以是一个集合,同时包括[学号],[身份证号]
50-
>而主键是从候选键里选出一个属性出来,要么是[学号],要么是[身份证号]。(不考虑联合主键哈)
50+
>但是候选键可以是一个集合:{[学号],[身份证号]}
51+
>而主键是从候选键里选出一个属性出来,要么是{[学号]},要么是{[身份证号]}。(不考虑联合主键哈)
5152
5253
* 外键: **外键是约束一个数据表和另一个数据表表的关系的属性列。**
5354
>如何确定学生在哪个班级呢?或者说如何确定某个班级有哪些学生呢?
5455
>一个班级可以有多个学生.这就属于一对多关系。
5556
>可以在学生表中加一个班级id的外键列,与班级表的班级id关联,
5657
>这样就可以确定学生与班级的关系了。
5758
58-
#### 联合主键和复合主键
5959

60-
```text
61-
网上有文章说联合主键和复合主键有区别,但我个人认为没区别。
62-
```
60+
#### 联合主键(复合主键)
6361

64-
**在我看来联合主键和复合主键都是以多个属性列共同组合的主键
62+
**联合主键是以多个属性列共同组成的主键
6563
它们以组合的形式保证数据的唯一性。**
6664

67-
>有的同学说联合主键是多个主键组合成的主键,
68-
>而我想反驳:一个表只有一个主键呀,哪来的那么多主键。
69-
>我估摸着有同学大概是想说多个唯一属性的列组成的主键吧,那还不是属于组合主键。。
70-
>当然,也可能是我功力不足,认识不到吧。
7165

7266
#### DDL,DML,DCL,DQL,TCL
7367
* DDL(Data Define Language:数据定义语言):**DDL的功能是用于定义数据库中的模式(Schema),
7468
模式包含了表,视图,存储过程等集合。** 这里准确来说应该是定义数据库的三级模式:外模式,模式(逻辑模式,概念模式)和内模式。
75-
7669
>DDL的关键字有: CREATE , ALTER , DROP等。
7770
7871
- DML(Data Manipulation Language:数据操纵语言):**DML的功能是用于操作数据库中的数据。**
79-
8072
>DML的关键字有: SELECT , DELETE , UPDATE , INSERT等。
8173
8274
- DCL(Data Control Language:数据控制语言): **DCL的功能是用于设置数据库的用户权限。**
83-
8475
>DCL的关键字有: GRANT,REVOKE等。
8576
8677
- TCL(Transaction Control Language:事务控制语言): **TCL的功能是用于管理事务。**
87-
8878
>TCL的关键字有: BEGIN , COMMIT , ROLLBACK等。
8979
9080
- DQL(Data Query Language:数据查询语言): 数据查询语言,它属于DML。
91-
9281
>DQL的主要关键字就是SELECT了。
9382
83+
9484
#### DROP , TRUNCATE , DELETE区别
9585

9686
- DROP: 删除表(包括表的所有索引和数据)或数据库。**DROP属于DDL,操作不可回滚。**

gitbook_doc/rdbms-learning/索引.md

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<!-- TOC -->
22

3-
* [索引](#索引)
3+
* [索引](#索引)
44
* [什么是索引?](#什么是索引)
55
* [索引的优点](#索引的优点)
66
* [索引的缺点](#索引的缺点)
@@ -45,16 +45,19 @@
4545
>
4646
>如果有目录了,我们只需要先去目录里查找字所在的页数,然后直接翻到那一页就行了。
4747
48+
4849
#### 索引的优点
4950
**索引最大的优点就是数据的检索效率高,这也是创建和使用索引的原因。
5051
毕竟大部分系统的读请求总是大于写请求的。**
5152

53+
5254
#### 索引的缺点
5355
* **创建索引和维护索引需要耗费许多时间** : 当对表中的数据进行增删改的时候,如果数据有索引,
5456
那么索引也需要动态的修改,会降低SQL执行效率。
5557

5658
* **占用物理存储空间** : 索引需要使用物理文件存储,也会耗费一定空间。
5759

60+
5861
#### B树和B+树区别
5962

6063
* **B树的所有节点既存放 键(key) 也存放 数据(data);**
@@ -69,6 +72,7 @@
6972

7073
![B+树](../../img/database/mysql/B+树.png)
7174

75+
7276
#### Hash索引
7377
* **Hash索引定位快**
7478
>Hash索引指的就是Hash表,最大的优点就是能够在很短的时间内,
@@ -103,6 +107,7 @@ SELECT * FROM tb1 WHERE id < 500;
103107
InnoDB会自动先检查表中是否有唯一索引的字段。
104108
如果有,则选择该字段为默认的主键,否则InnoDB将会自动创建一个6Byte的自增主键。**
105109

110+
106111
#### 二级索引(辅助索引)
107112
**二级索引又称为辅助索引,是因为二级索引的叶子节点存储着主键。
108113
也就是说,通过二级索引,可以定位主键的位置。**
@@ -140,6 +145,7 @@ Mysql5.6之前只有MYISAM引擎支持全文索引,5.6之后InnoDB也支持了
140145
对于InnoDB引擎表来说,该表的索引(B+树)的每个非叶子节点存储索引,
141146
叶子节点存储索引和索引对应的数据。
142147

148+
143149
#### 聚集索引的优点
144150

145151
聚集索引的查询速度非常的快,因为整个B+树本身就是一颗多叉平衡树,
@@ -156,6 +162,7 @@ Mysql5.6之前只有MYISAM引擎支持全文索引,5.6之后InnoDB也支持了
156162
>而且况聚集索引的叶子节点还存放着数据,修改代价肯定是较大的,
157163
>所以对于主键索引来说,主键一般都是不可被修改的。
158164
165+
159166
#### 非聚集索引
160167

161168
**非聚集索引即索引结构和数据分开存放的索引。**
@@ -170,15 +177,13 @@ MYISAM引擎的表的.MYI文件包含了表的索引,
170177
因为二级索引的叶子节点就存放的是主键。**
171178

172179
#### 非聚集索引的优点
173-
* 更新代价比聚集索引要小
174-
>非聚集索引的更新代价就没有聚集索引那么大了,非聚集索引的叶子节点是不存放数据的
180+
* 更新代价比聚集索引要小:非聚集索引的更新代价就没有聚集索引那么大了,非聚集索引的叶子节点是不存放数据的
175181

176182
#### 非聚集索引的缺点
177183
* 跟聚集索引一样,非聚集索引也依赖于有序的数据
178184

179-
* 可能会二次查询(回表)
180-
>这应该是非聚集索引最大的缺点了。
181-
>当查到索引对应的指针或主键后,可能还需要根据指针或主键再到数据文件或表中查询。
185+
* 可能会二次查询(回表):这应该是非聚集索引最大的缺点了。
186+
当查到索引对应的指针或主键后,可能还需要根据指针或主键再到数据文件或表中查询。
182187

183188
这是Mysql的表的文件截图:
184189

@@ -188,6 +193,7 @@ MYISAM引擎的表的.MYI文件包含了表的索引,
188193

189194
![B+树聚集索引](../../img/database/mysql/B+树索引.png)
190195

196+
191197
#### 非聚集索引一定回表查询吗(覆盖索引)?
192198

193199
**非聚集索引不一定回表查询。**
@@ -210,6 +216,7 @@ SELECT id FROM table WHERE id=1;
210216
>主键索引本身的key就是主键,查到返回就行了。
211217
>这种情况就称之为覆盖索引了。
212218
219+
213220
#### 覆盖索引
214221
**覆盖索引即需要查询的字段正好是索引的字段,那么查找到该索引的字段就可以返回了,而无需回表查询。**
215222

@@ -227,9 +234,11 @@ SELECT id FROM table WHERE id=1;
227234
#### 单列索引
228235
单列索引即由一列属性组成的索引。
229236

237+
230238
#### 联合索引(多列索引)
231239
联合索引即由多列属性组成索引。
232240

241+
233242
#### 最左前缀原则
234243
>假设创建的联合索引由三个字段组成:
235244
@@ -251,11 +260,13 @@ ALTER TABLE table ADD INDEX index_name (num,name,age)
251260

252261
![联合索引生效](../../img/database/mysql/联合索引之查询条件生效.png)
253262

263+
254264
### 索引创建注意点
255265

256266
#### 最左前缀原则
257267
>虽然我目前的Mysql版本较高,好像不遵守最左前缀原则,索引也会生效。
258-
>但是我们仍应遵守最左前缀原则,以免版本更迭带来的麻烦。
268+
>但是我们仍应遵守最左前缀原则。
269+
259270

260271
#### 选择合适的字段
261272

@@ -270,12 +281,14 @@ ALTER TABLE table ADD INDEX index_name (num,name,age)
270281
* 被经常频繁用于连接的字段: 经常用于连接的字段可能是一些外键列,外键列并不是一定要建立外键,
271282
只是说该列涉及到表与表的关系。对于频繁被连接查询的字段,可以考虑建立索引,提高多表连接查询的效率。
272283

284+
273285
#### 不合适的字段
274286
* 被频繁更新的字段应该慎重建立索引: 虽然索引能带来查询上的效率,但是维护索引的成本也是不小的。
275287
如果一个字段不被经常查询,反而被经常修改,那么就更不应该在这种字段上建立索引了。
276288

277289
* 不被经常查询的字段没有必要建立索引
278290

291+
279292
#### 尽可能的考虑建立联合索引而不是单列索引
280293

281294
因为索引是需要占用磁盘空间的,可以**简单理解为每个索引都对应着一颗B+树。**
@@ -285,10 +298,12 @@ ALTER TABLE table ADD INDEX index_name (num,name,age)
285298
如果是联合索引,多个字段在一个索引上,那么将会节约很大磁盘空间,
286299
且修改数据的操作效率也会提升。
287300

301+
288302
#### 考虑在字符串类型的字段上使用前缀索引代替普通索引
289303
**前缀索引仅限于字符串类型,较普通索引会占用更小的空间,**
290304
所以可以考虑使用前缀索引带替普通索引。
291305

306+
292307
#### 使用索引一定能提高查询性能吗?
293308
大多数情况下,索引查询都是比全表扫描要快的。
294-
但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。
309+
但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。

rdbms-learning/RDBMS常见知识点.md

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<!-- TOC -->
22

3-
* [RDBMS常见知识点](#rdbms常见知识点)
3+
* [RDBMS常见知识点](#rdbms常见知识点)
44
* [键是什么?](#键是什么)
55
* [超键 / 候选键 / 主键 / 外键?](#超键--候选键--主键--外键)
6-
* [联合主键和复合主键](#联合主键和复合主键)
6+
* [联合主键(复合主键)](#联合主键复合主键)
77
* [DDL,DML,DCL,DQL,TCL](#ddldmldcldqltcl)
88
* [DROP , TRUNCATE , DELETE区别](#drop--truncate--delete区别)
99
* [数据库设计范式(Normal Form)?](#数据库设计范式normal-form)
@@ -31,66 +31,56 @@
3131
班级表有: 班级id,班级名等属性.
3232
```
3333

34+
3435
#### 超键 / 候选键 / 主键 / 外键?
3536
* 超键: 超键是能唯一标识数据表中的记录的**属性集的集合**
3637
>超键可以是一个属性,也可以是属性组合。
3738
>如学生表中的学号可以作为学生的唯一标识,
3839
>身份证号也可以作为学生的唯一标识,那么与这2个属性任意搭配的集合,
3940
>都可以作为学生表的超键:
40-
>[[学号][身份证号],[学号,身份证号][学号,性别][身份证号,性别]...]等等。
41+
>{[学号][身份证号],[学号,身份证号][学号,性别][身份证号,性别]...}等等。
4142
4243
* 候选键: 候选键是能唯一标识数据表中的记录的**属性的集合。**
4344
>可以把候选键看作是最小粒度的超键,即没有冗余的超键。
44-
>学生表中的候选键为:[[学号][身份证号]]
45-
>但是不能有[学号,身份证号],因为学号和身份证号同时存在就不是最小粒度了。
45+
>学生表中的候选键可以为:{[学号][身份证号]}
46+
>但是不能为{[学号,身份证号]},因为学号和身份证号同时存在就不是最小粒度了。
4647
4748
* 主键: **主键是能唯一标识数据表中的记录的属性列。**
4849
>看起来主键和候选键区别不大。
49-
>但是候选键可以是一个集合,同时包括[学号],[身份证号]
50-
>而主键是从候选键里选出一个属性出来,要么是[学号],要么是[身份证号]。(不考虑联合主键哈)
50+
>但是候选键可以是一个集合:{[学号],[身份证号]}
51+
>而主键是从候选键里选出一个属性出来,要么是{[学号]},要么是{[身份证号]}。(不考虑联合主键哈)
5152
5253
* 外键: **外键是约束一个数据表和另一个数据表表的关系的属性列。**
5354
>如何确定学生在哪个班级呢?或者说如何确定某个班级有哪些学生呢?
5455
>一个班级可以有多个学生.这就属于一对多关系。
5556
>可以在学生表中加一个班级id的外键列,与班级表的班级id关联,
5657
>这样就可以确定学生与班级的关系了。
5758
58-
#### 联合主键和复合主键
5959

60-
```text
61-
网上有文章说联合主键和复合主键有区别,但我个人认为没区别。
62-
```
60+
#### 联合主键(复合主键)
6361

64-
**在我看来联合主键和复合主键都是以多个属性列共同组合的主键
62+
**联合主键是以多个属性列共同组成的主键
6563
它们以组合的形式保证数据的唯一性。**
6664

67-
>有的同学说联合主键是多个主键组合成的主键,
68-
>而我想反驳:一个表只有一个主键呀,哪来的那么多主键。
69-
>我估摸着有同学大概是想说多个唯一属性的列组成的主键吧,那还不是属于组合主键。。
70-
>当然,也可能是我功力不足,认识不到吧。
7165

7266
#### DDL,DML,DCL,DQL,TCL
7367
* DDL(Data Define Language:数据定义语言):**DDL的功能是用于定义数据库中的模式(Schema),
7468
模式包含了表,视图,存储过程等集合。** 这里准确来说应该是定义数据库的三级模式:外模式,模式(逻辑模式,概念模式)和内模式。
75-
7669
>DDL的关键字有: CREATE , ALTER , DROP等。
7770
7871
- DML(Data Manipulation Language:数据操纵语言):**DML的功能是用于操作数据库中的数据。**
79-
8072
>DML的关键字有: SELECT , DELETE , UPDATE , INSERT等。
8173
8274
- DCL(Data Control Language:数据控制语言): **DCL的功能是用于设置数据库的用户权限。**
83-
8475
>DCL的关键字有: GRANT,REVOKE等。
8576
8677
- TCL(Transaction Control Language:事务控制语言): **TCL的功能是用于管理事务。**
87-
8878
>TCL的关键字有: BEGIN , COMMIT , ROLLBACK等。
8979
9080
- DQL(Data Query Language:数据查询语言): 数据查询语言,它属于DML。
91-
9281
>DQL的主要关键字就是SELECT了。
9382
83+
9484
#### DROP , TRUNCATE , DELETE区别
9585

9686
- DROP: 删除表(包括表的所有索引和数据)或数据库。**DROP属于DDL,操作不可回滚。**

0 commit comments

Comments
 (0)