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 - [ 垂直切分的缺点] ( #垂直切分的缺点 )
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-共享锁 )
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
10781094https://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
13721388MySQL/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
0 commit comments