思考并回答以下问题:
06 | 全局锁和表锁:给表加个字段怎么有这么多阻碍?
思考并回答以下问题:
- 数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。怎么理解?
- 根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。都是什么样子的?
- MySQL提供了一个加全局读锁的方法,命令是
Flush tables with read lock (FTWRL)
。全局锁的典型使用场景是,做全库逻辑备份。怎么理解? - 另一类表级的锁是MDL(meta data lock)。MDL不需要显式使用,在访问一个表的时候会被自动加上。MDL的作用是,保证读写的正确性。怎么理解?
- 给一个表加字段,或者修改字段,或者加索引,需要扫描全表的数据。怎么理解?
05 | 深入浅出索引(下)
思考并回答以下问题:
- 直接提供查询结果,不需要回表,索引k已经“覆盖了”我们的查询需求,我们称为覆盖索引。怎么理解?
- 在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。怎么理解索引下推?
- 优化的一个方向是减少回表。怎么理解?
04 | 深入浅出索引(上)
思考并回答以下问题:
- 为什么哈希表这种结构适用于只有等值查询的场景?因为不是有序的,所以哈希索引做区间查询的速度是很慢的。怎么理解?
- 有序数组在等值查询和范围查询场景中的性能就都非常优秀,在需要更新数据的时候就麻烦了。怎么理解?
- 显然,主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。怎么理解?
03 | 事务隔离:为什么你改了我还看不见?
思考并回答以下问题:
- 隔离得越严实,效率就会越低。因此很多时候,我们都要在二者之间寻找一个平衡点。怎么理解?
- 读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。怎么理解?
- 读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。怎么理解?
- 可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。怎么理解?
- 对于RR,你可以这么想,每个事务启动的时候打一个快照,别人改的“我不听我不听”。怎么理解?
- 长事务可能用到的回滚记录都必须保留,这就会导致大量占用存储空间。怎么理解?
02 | 日志系统:一条SQL更新语句是如何执行的?
思考并回答以下问题:
- WAL的全称是Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。怎么理解?
- 有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe。怎么理解?
- redo log是InnoDB引擎特有的日志,而Server层也有自己的日志,称为binlog。为什么会有两份日志呢?
- redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1”。怎么理解?
- redo log是循环写的,空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。怎么理解?
- 将redo log的写入拆成了两个步骤:prepare和commit,这就是”两阶段提交”。怎么理解?
- innodb_flush_log_at_trx_commit这个参数设置成1的时候,表示每次事务的redo log都直接持久化到磁盘。sync_binlog这个参数设置成1的时候,表示每次事务的binlog都持久化到磁盘。怎么理解?
01 | 基础架构:一条SQL查询语句是如何执行的?
思考并回答以下问题:
- 不同的存储引擎共用一个Server层,也就是从连接器到执行器的部分。怎么理解?
- wait_timeout参数是干嘛用的?长连接是什么意思?
- 你会在数据库的慢查询日志中看到一个rows_examined的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟rows_examined并不是完全相同的。怎么理解?