Skip to content

Commit c7bfea4

Browse files
committed
no message
1 parent f39f8fb commit c7bfea4

2 files changed

Lines changed: 46 additions & 24 deletions

File tree

notes/MySQL.md

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,20 @@
6060
- [6. 索引的缺点](#6-索引的缺点)
6161
- [7. 索引失效](#7-索引失效)
6262
- [8. 在什么情况下适合建立索引](#8-在什么情况下适合建立索引)
63-
- [9. 联合索引](#9-联合索引)
63+
- [9. 为什么用B+树做索引而不用B-树或红黑树](#9-为什么用b树做索引而不用b-树或红黑树)
64+
- [10. 联合索引](#10-联合索引)
6465
- [1. 什么是联合索引](#1-什么是联合索引)
6566
- [2. 命名规则](#2-命名规则)
6667
- [3. 创建索引](#3-创建索引)
6768
- [4. 索引类型](#4-索引类型)
6869
- [5. 删除索引](#5-删除索引)
6970
- [6. 什么情况下使用索引](#6-什么情况下使用索引)
70-
- [10. 主键、外键和索引的区别](#10-主键外键和索引的区别)
71-
- [11. 聚集索引与非聚集索引](#11-聚集索引与非聚集索引)
72-
- [12. 数据库中的分页查询语句怎么写,如何优化](#12-数据库中的分页查询语句怎么写如何优化)
73-
- [13. 常用的数据库有哪些?Redis用过吗?](#13-常用的数据库有哪些redis用过吗)
74-
- [14. Redis的数据结构](#14-redis的数据结构)
75-
- [15. 分库分表](#15-分库分表)
71+
- [11. 主键、外键和索引的区别](#11-主键外键和索引的区别)
72+
- [12. 聚集索引与非聚集索引](#12-聚集索引与非聚集索引)
73+
- [13. 数据库中的分页查询语句怎么写,如何优化](#13-数据库中的分页查询语句怎么写如何优化)
74+
- [14. 常用的数据库有哪些?Redis用过吗?](#14-常用的数据库有哪些redis用过吗)
75+
- [15. Redis的数据结构](#15-redis的数据结构)
76+
- [16. 分库分表](#16-分库分表)
7677
- [1. 垂直切分](#1-垂直切分)
7778
- [垂直切分的优点](#垂直切分的优点)
7879
- [垂直切分的缺点](#垂直切分的缺点)
@@ -85,18 +86,18 @@
8586
- [事务问题](#事务问题)
8687
- [JOIN](#join)
8788
- [ID 唯一性](#id-唯一性)
88-
- [16. 主从复制与读写分离](#16-主从复制与读写分离)
89+
- [17. 主从复制与读写分离](#17-主从复制与读写分离)
8990
- [主从复制](#主从复制)
9091
- [读写分离](#读写分离)
91-
- [17. 查询性能优化](#17-查询性能优化)
92+
- [18. 查询性能优化](#18-查询性能优化)
9293
- [1. 使用 Explain 进行分析](#1-使用-explain-进行分析)
9394
- [2. 优化数据访问](#2-优化数据访问)
9495
- [1. 减少请求的数据量](#1-减少请求的数据量)
9596
- [2. 减少服务器端扫描的行数](#2-减少服务器端扫描的行数)
9697
- [3. 重构查询方式](#3-重构查询方式)
9798
- [1. 切分大查询](#1-切分大查询)
9899
- [2. 分解大连接查询](#2-分解大连接查询)
99-
- [18. 锁类型](#18-锁类型)
100+
- [19. 锁类型](#19-锁类型)
100101
- [1. 乐观锁](#1-乐观锁)
101102
- [2. 悲观锁](#2-悲观锁)
102103
- [3. 共享锁](#3-共享锁)
@@ -116,7 +117,7 @@
116117

117118
# 前言
118119

119-
在本文将讨论数据库原理和MySQL核心知识,MySQL性能优化等,包含 MySQL基础高性能MySQL实践 两部分。
120+
在本文将讨论数据库原理和 MySQL 核心知识,MySQL 性能优化等,包含 **MySQL基础****高性能MySQL实践** 两部分。
120121

121122

122123

@@ -972,7 +973,22 @@ MyISAM 存储引擎支持空间数据索引,可以用于地理数据存储。
972973
更多资料:[MySQL索引背后的数据结构及算法原理](https://www.kancloud.cn/kancloud/theory-of-mysql-index/41846)
973974

974975

975-
## 9. 联合索引
976+
977+
## 9. 为什么用B+树做索引而不用B-树或红黑树
978+
979+
B+ 树只有叶节点存放数据,其余节点用来索引,而 B- 树是每个索引节点都会有 Data 域。所以从 InooDB 的角度来看,B+ 树是用来充当索引的,一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上。
980+
981+
- 那么 MySQL如何衡量查询效率呢?答:磁盘 IO 次数
982+
- B- 树 / B+ 树 的特点就是每层节点数目非常多,层数很少,目的就是为了就少磁盘 IO 次数,但是 B- 树的每个节点都有 data 域(指针),这无疑增大了节点大小,说白了增加了磁盘 IO 次数(磁盘 IO 一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO 次数增多,一次 IO 多耗时),而 B+ 树除了叶子节点其它节点并不存储数据,节点小,磁盘 IO 次数就少。
983+
- B+ 树所有的 Data 域在叶子节点,一般来说都会进行一个优化,就是**将所有的叶子节点用指针串起来**。这样遍历叶子节点就能获得全部数据,这样就能进行区间访问啦。在数据库中基于范围的查询是非常频繁的,而 B 树不支持这样的遍历操作。
984+
985+
- B 树相对于红黑树的区别
986+
- **AVL 树和红黑树基本都是存储在内存中才会使用的数据结构**。在大规模数据存储的时候,红黑树往往出现由于**树的深度过大**而造成磁盘 IO 读写过于频繁,进而导致效率低下的情况。为什么会出现这样的情况,我们知道要获取磁盘上数据,必须先通过磁盘移动臂移动到数据所在的柱面,然后找到指定盘面,接着旋转盘面找到数据所在的磁道,最后对数据进行读写。磁盘IO代价主要花费在查找所需的柱面上,树的深度过大会造成磁盘IO频繁读写。根据**磁盘查找存取的次数往往由树的高度所决定**,所以,只要我们通过某种较好的树结构减少树的结构尽量减少树的高度,B树可以有多个子女,从几十到上千,可以降低树的高度。
987+
- **数据库系统的设计者巧妙利用了磁盘预读原理**,将一个节点的大小设为等于一个页,这样每个节点只需要一次 I/O 就可以完全载入。为了达到这个目的,在实际实现 B-Tree 还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证**一个节点物理上也存储在一个页里**,加之计算机存储分配都是按页对齐的,就实现了一个 node 只需一次 I/O。
988+
989+
990+
991+
## 10. 联合索引
976992

977993
### 1. 什么是联合索引
978994

@@ -1063,7 +1079,7 @@ PRIMARY KEY 索引和 UNIQUE 索引非常类似。
10631079

10641080

10651081

1066-
## 10. 主键、外键和索引的区别
1082+
## 11. 主键、外键和索引的区别
10671083

10681084
| | 定义 | 作用 | 个数 |
10691085
| -------- | ---------------------------------------------------- | ------------------------ | ------------------------ |
@@ -1073,7 +1089,7 @@ PRIMARY KEY 索引和 UNIQUE 索引非常类似。
10731089

10741090

10751091

1076-
## 11. 聚集索引与非聚集索引
1092+
## 12. 聚集索引与非聚集索引
10771093

10781094
https://www.cnblogs.com/s-b-b/p/8334593.html
10791095

@@ -1083,7 +1099,7 @@ https://www.cnblogs.com/s-b-b/p/8334593.html
10831099

10841100

10851101

1086-
## 12. 数据库中的分页查询语句怎么写,如何优化
1102+
## 13. 数据库中的分页查询语句怎么写,如何优化
10871103

10881104
- Mysql 的 limit 用法
10891105
- SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
@@ -1092,7 +1108,7 @@ https://www.cnblogs.com/s-b-b/p/8334593.html
10921108

10931109

10941110

1095-
## 13. 常用的数据库有哪些?Redis用过吗?
1111+
## 14. 常用的数据库有哪些?Redis用过吗?
10961112

10971113
- 常用的数据库有哪些?Redis用过吗?
10981114
- 常用的数据库
@@ -1114,7 +1130,7 @@ https://www.cnblogs.com/s-b-b/p/8334593.html
11141130

11151131

11161132

1117-
## 14. Redis的数据结构
1133+
## 15. Redis的数据结构
11181134

11191135
- STRING:可以是字符串、整数或者浮点数
11201136
- LIST:一个链表,链表上的每个节点都包含了一个字符串
@@ -1128,7 +1144,7 @@ https://www.cnblogs.com/s-b-b/p/8334593.html
11281144

11291145

11301146

1131-
## 15. 分库分表
1147+
## 16. 分库分表
11321148

11331149
简单来说,数据的切分就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果,即分库分表。
11341150

@@ -1237,7 +1253,7 @@ https://www.cnblogs.com/s-b-b/p/8334593.html
12371253

12381254

12391255

1240-
## 16. 主从复制与读写分离
1256+
## 17. 主从复制与读写分离
12411257

12421258
### 主从复制
12431259

@@ -1269,7 +1285,7 @@ MySQL 读写分离能提高性能的原因在于:
12691285

12701286

12711287

1272-
## 17. 查询性能优化
1288+
## 18. 查询性能优化
12731289

12741290
### 1. 使用 Explain 进行分析
12751291

@@ -1367,7 +1383,7 @@ SELECT * FROM post WHERE post.id IN (123,456,567,9098,8904);
13671383

13681384

13691385

1370-
## 18. 锁类型
1386+
## 19. 锁类型
13711387

13721388
MySQL/InnoDB 的加锁,一直是一个面试中常问的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?在工作过程中,也会经常用到,乐观锁,排它锁等。
13731389

@@ -1489,7 +1505,7 @@ update test_one set name="www.souyunku.com" where id =1 lock in share mode;
14891505

14901506
在查询语句后面增加 `lock in share mode`,MySQL 会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。
14911507

1492-
加上共享锁后,对于 `update,insert,delete` 语句会自动加排它锁。
1508+
加上共享锁后,对于 `update,insert,delete` 语句会自动加排它锁。
14931509

14941510
### 4. 排它锁
14951511

@@ -1501,7 +1517,7 @@ update test_one set name="www.souyunku.com" where id =1 lock in share mode;
15011517

15021518
读取为什么要加读锁呢:防止数据在被读取的时候被别的线程加上写锁
15031519

1504-
使用方式:在需要执行的语句后面加上 `for update` 就可以了
1520+
使用方式:在需要执行的语句后面加上 `for update` 就可以了
15051521

15061522

15071523

notes/SQL.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# 前言
2+
3+
在这部分将整理 SQL 语句的使用
4+
5+
6+
17
# SQL基础
28

39
## 1. INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN
@@ -31,7 +37,7 @@ ORDER BY Persons.LastName
3137

3238
![20150603222827804](assets/20150603222827804.png)
3339

34-
此种连接方式 Orders 表中 Id_P 字段在 Persons 表中找不到匹配的,则不会列出来。
40+
此种连接方式 Orders 表中 Id_P 字段在 Persons 表中找不到匹配的,则不会列出来。
3541

3642

3743

0 commit comments

Comments
 (0)