Skip to content

Commit f584a48

Browse files
authored
Update 数据库-MySQL.md
1 parent e0b81e3 commit f584a48

File tree

1 file changed

+17
-2
lines changed

1 file changed

+17
-2
lines changed

MD/数据库-MySQL.md

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,34 @@ select * from table_name inner join ( select id from table_name where (user = xx
6767
3. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行,然后你可以扯到隔离级别;
6868
4. 持久性(Durability):一个事务一旦提交,对数据库的修改应该永久保存。
6969

70+
不同事务隔离级别的问题:
7071
[https://www.jianshu.com/p/4e3edbedb9a8](https://www.jianshu.com/p/4e3edbedb9a8)
7172

7273
## 锁表、锁行
74+
1. InnoDB 支持表锁和行锁,使用索引作为检索条件修改数据时采用行锁,否则采用表锁
75+
2. InnoDB 自动给修改操作加锁,给查询操作不自动加锁
76+
3. 行锁相对于表锁来说,优势在于高并发场景下表现更突出,毕竟锁的粒度小
77+
4. 当表的大部分数据需要被修改,或者是多表复杂关联查询时,建议使用表锁优于行锁
78+
7379
[https://segmentfault.com/a/1190000012773157](https://segmentfault.com/a/1190000012773157)
7480

7581
### 悲观锁乐观锁、如何写对应的SQL
82+
悲观锁:select for update
83+
乐观锁:先查询一次数据,然后使用查询出来的数据+1进行更新数据,如果失败则循环
84+
7685
[https://www.jianshu.com/p/f5ff017db62a](https://www.jianshu.com/p/f5ff017db62a)
7786

7887
### 索引
7988
#### 原理
80-
我们拿出一本新华字典,它的目录实际上就是一种索引:非聚集索引。我们可以通过目录迅速定位我们要查的字。而字典的内容部分一般都是按照拼音排序的,这实际上又是一种索引:聚集索引。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
89+
聚集索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引
90+
非聚集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引
91+
92+
#### 索引原理
93+
使用B+树来构建索引,为什么不用二叉树?因为红黑树在磁盘上的查询性能远不如B+树
94+
95+
红黑树最多只有两个子节点,所以高度会非常高,导致遍历查询的次数会多,又因为红黑树在数组中存储的方式,导致逻辑上很近的父节点与子节点可能在物理上很远,导致无法使用磁盘预读的局部性原理,需要很多次IO才能找到磁盘上的数据
8196

82-
使用B+树来构建索引,为什么不用二叉树?红黑树在磁盘上的查询性能远不如B+树。原因是红黑树最多只有两个子节点,所以高度会非常高,导致遍历查询的次数会多,又因为红黑树在数组中存储的方式,导致逻辑上很近的父节点与子节点可能在物理上很远,导致无法使用磁盘预读的局部性原理,需要很多次IO才能找到磁盘上的数据;但B+树一个节点中可以存储很多个索引的key,且将大小设置为一个页,一次磁盘IO就能读取很多个key,且叶子节点之间还加上了下个叶子节点的指针,遍历索引也会很快。
97+
但B+树一个节点中可以存储很多个索引的key,且将大小设置为一个页,一次磁盘IO就能读取很多个key,且叶子节点之间还加上了下个叶子节点的指针,遍历索引也会很快。
8398

8499
B+树的高度如何计算?在Linux里,每个页默认4KB,假设索引的是8B的long型数据,每个key后有个页号4B,还有6B的其他数据(参考《MySQL技术内幕:InnoDB存储引擎》P193的页面数据),那么每个页的扇出系数为4KB/(8B+4B+6B)=227,即每个页可以索引245个key。在高度h=3时,s=227^3=1100万。通常来说,索引树的高度在2~4。
85100

0 commit comments

Comments
 (0)