Skip to content

Commit 8ded0b8

Browse files
committed
Feat: 新增数据结构与算法笔记
-新增数据结构与算法笔记
1 parent cfd9385 commit 8ded0b8

File tree

2 files changed

+64
-2
lines changed

2 files changed

+64
-2
lines changed

DB.Tec/MySQL/MySQL学习杂记.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
3. 最左前缀的原则: 即最左优先.
66
如果有一个2列的索引(col1,col2),则已经对(col1), (col1, col2)建立了索引.
77
如果有一个3列索引(col1, col2, col3), 则已经对(col1), (col1, col2), (col1,col2,col3)建立了索引.
8+
4. 第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是要考虑的采用的.
9+
5. 第二原则需要考虑空间,如果多维护的索引占用的空间较大,则优先考虑将占用空间大的索引放置在最左侧.
810

911
#####0X02 覆盖索引
1012
1. 定义: 如果一个索引包含或者说覆盖所有需要查询的字段的值,我们就称为覆盖索引.
@@ -84,7 +86,11 @@
8486
+ 在InnoDB中,innodb_lock_wait_timeout=50s.设置发生死锁的超时时间.
8587
+ innodb_deadlock_detect=on,主动死锁检测.
8688
+ 如果事务中,需要锁多个行,要把最可能造成锁冲突最可能影响系统并发度的锁的申请时间往后放.
87-
89+
12. 索引下推优化:
90+
+ 在MySQL5.6中引入了索引下推优化,可以在索引遍历的过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的数据,减少回表的次数.
91+
13. 索引的选择和使用:
92+
+ 唯一索引的更新不能使用change buffer,实际上也只有普通索引可以使用.
93+
+ change buffer因为减少了随机磁盘的访问,所以对更新性能的提升是很明显的.
8894

8995

9096

Other.Tec/Interview/DailyRecord.md

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,5 +150,61 @@ $a[] = &$a;
150150
> -t: 设置间隔符.
151151
> -k: 指定排序的列数.(从1开始)
152152
```
153-
153+
2020年面试
154+
#### 0X01 跟谁学 PHP数据中台
155+
1. Redis中RDB的实现:
156+
* RDB持久化既可以手动执行,也可以根据服务器配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到磁盘中.
157+
* RDB持久化所生成的是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态.
158+
* 有两个命令可以生成RDB文件,一个是SAVE,一个是BGSAVE.
159+
* RDB文件的载入是在Redis服务器启动时自动执行的.
160+
* 如果数据库启动了AOF持久化,服务器会优先使用AOF文件来还原数据库状态.
161+
* 只有在AOF持久化关闭的情况下,才会使用RDB文件来还原数据库状态.
162+
* Save命令执行时,服务器的状态:
163+
* Redis服务器会被阻塞,只有执行完Save命令,才会重新开始接受请求.
164+
* BGSAVE命令执行时,服务器的状态:
165+
* Redis服务器仍然可以接受处理客户端的命令请求.
166+
* 客户端发送的SAVE命令会被服务器拒绝,服务器禁止SAVE命令和BGSAVE命令同时执行,为了避免产生竞争.
167+
* 服务器禁止两个BGSAVE命令同时执行,为了避免竞争.
168+
* 如果BGREWRITEAOF命令正在执行,则BGSAVE命令会被服务器拒绝.为了避免性能问题.
169+
* 服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入工作完成为止.
170+
* 针对不同的键值对,RDB会使用不同的方式来保存它们.
171+
* AOF:
172+
* AOF持久化是通过保存Redis所执行的写命令来记录数据库状态的.
173+
* 被写入AOF文件的所有命令都是以Redis的命令请求协议保存的.
174+
* AOF持久化功能的实现可以分为命令追加,文件写入,文件同步三个过程.
175+
* 命令追加: 服务器在执行完一个写命令后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾.
176+
* 为了解决AOF文件体积膨胀的问题,Redis提供了AOF文件重写功能.
177+
* AOF后台重写:
178+
* 子进程进行AOF重写期间,服务器进程可以继续处理命令请求.
179+
* 子进程带有服务器进程的数据副本,可以避免在使用锁的情况下,保证数据的安全性.
180+
* appendfync选项的不同值对AOF持久化功能的安全性以及Redis服务器的性能有很大的影响.
181+
* AOF重写可以产生一个新的文件,这个文件和原有的AOF文件所保存的数据库状态一样,但体积更小.
182+
* 在执行BGREWRITEAOF命令时,Redis服务器会维护一个AOF重写缓冲区.
183+
2. Redis的RDB持久化为什么要fork一个子进程来实现:
184+
* 父进程继续处理client请求,子进程负责将内存内容写入到临时文件,由于OS写时复制机制,父子进程会共享相同的物理页面,当父进程处理写请求时,
185+
OS会为父进程要修改的页面创建副本,而不是写共享页面.所以子进程地址空间内的数据是fork时刻整个数据库的一个快照.
186+
3. MySQL中的索引一定都是放在内存中的吗?
187+
* 索引一般是存储在索引文件中,在使用的时候才会加载到内存中.
188+
4. MySQL为什么要用B+tree来实现数据存储?
189+
* B+树的数据结构有更小的磁盘I/O消耗.
190+
* 哈希表:
191+
* 哈希表这种结构适用于等值查询的场景,再做区间查询的时候就比较慢.
192+
* 有序数组:
193+
* 有序数组索引只适用于静态存储引擎.
194+
* 在更新数据的时候需要保证插入的顺序,成本太高.
195+
* 二叉搜索树:
196+
* 为了维持O(logn)的查询时间复杂度,需要保持这棵树是平衡二叉树.为了这个保证,更新的时间复杂度也是O(logn).
197+
* 大多数数据存储不使用二叉树,原因是索引不止存在于内存中,还要写到磁盘上.
198+
* InnoDB使用了B+树索引模型,所以数据都是存储在B+树中的.
199+
* 每个索引在InnoDB里对应一颗B+树.
200+
* 索引类型分为主键索引和非主键索引:
201+
* 主键索引的叶子节点存的是整行数据.
202+
* 非主键索引的叶子节点的内容是主键的值.
203+
* 非主键索引查询,需要先搜索非主键索引树,查找到主键后再到主键索引树查询,这个过程叫做回表.
204+
* 主键长度越小,普通索引叶子节点就越小,普通索引占用的空间就越小.
205+
* B+树能够很好的配合磁盘的读写特性,减少单次查询的访问磁盘次数.
206+
5. MySQL中全文索引的实现.
207+
* MySQL5.6之后的版本MyIsam和InnoDB都支持全文索引.
208+
* 只有字段类型是char varchar和text才可以创建全文索引.
209+
154210

0 commit comments

Comments
 (0)