1. 索引
- 索引结构(B+)
- 索引失效: 最左匹配;隐式转型;索引覆盖。
- 索引下推: 把服务层负责的筛选过程交给搜索引擎来执行,减少回表 IO;引用了自查询或者用了函数的查找不能下推,聚簇索引不存在下推。
- 索引合并: 对多个索引分别查询,再合并。
- 聚簇索引: 访问聚簇索引时尽量保持顺序访问,不然会有随机 IO 的问题,并且,聚簇索引的删除与修改可能导致页分裂问题。
- count(1) 与 count(*),优化器对于两者的优化是一致的,只有聚簇索引就走聚簇索引,有空间更小的二级索引,就可能走二级索引。
2. 事务
- 四种隔离级别(默认RR)
- MVCC
3. 缓存
- 查询缓存:在客户端的缓存,命中可以直接返回,适合缓存复杂查询,否则可能会更慢或者出现内存碎片。
- InnoDB 缓存池:非常重要,缓存行数据、自适应哈希索引、插入缓存、锁等等,延迟写入也是靠其实现的。
4. 持久化
InnoDB 引擎持久化是延迟写入的机制,首先事务是写入 Buffer 缓存池中的,当满足条件时,缓存会写入缓存日志中,缓存日志将随机 IO 变为了顺序 IO。后台线程负责把缓存日志中的信息刷进数据库磁盘,采用了双写缓存操作,首先修改的数据块回写进表的缓存区域中,之后再写入表中,这两个地方都可以通过检验码来保证数据完整性。这种异步写入的操作也更方便操作系统进行磁盘调度。
5. InnoDB 与 MyISAM对比
- InnoDB支持事务与行级锁
- MyISAM支持全文索引,另外其支持压缩表
- MyISAM数据恢复存在问题
- 如果不在乎数据恢复与并发能力,在乎空间,可以选MyISAM
- InnoDB自适应哈希,当引擎注意到一些索引值使用频繁时,会创建一个哈希索引。
- MyISAM只缓存索引,InnoDB缓存池缓存很多东西。
6. 数据库设计三范式
- 原子性
- 消除部分依赖(全部依赖主键)
- 消除传递性依赖