局部性原理
时间局部性和空间局部性
磁盘预读(预读的长度一般为页(page)的整数倍)
- 页是存储器的逻辑块,操作系统往往将主存和磁盘存储区分割为连续的大小相等的块
- 每个存储块称为一页(在血多操作系统中,页大小通常为4k)
- 主存和磁盘以页为单位交换数据
索引
扰动函数
红黑树不是严格的平衡树,是对AVL树的升级
B树
B+树
InnoDB--B+Tree,叶子结点直接放置数据
回表
mysql MyISAM -- B+Tree
聚簇索引,索引文件和数据文件放在一起
非聚簇索引,索引文件和数据文件分开放
- InnoDB使用聚集索引,数据根据主索引存储在叶子节点上,辅助索引的data域存储主键
- myisam使用非聚集索引,即主索引(B+树)的叶子节点存储数据的地址,myisam可以没有主键,数据也不是存储在B+主索引的叶子节点上的
回表
索引分类
- 唯一索引,不需要回表操作
- 普通索引,回表的时候可以通过覆盖索引优化
覆盖索引,选择id的时候,先查nameB+树,这棵树带着id,所以不需要回表
全文索引,myisam支持,mysql5.6之后的innodb开始支持
倒排索引,
组合索引,索引最左匹配原则(最左前缀)
选择合适的应用场景建立合适的索引,选择占用更小空间的索引
explain 来查询计划
索引下推
回表之前就已经把数据进行了一次筛选
MySQL存储引擎
索引维护
查询缓存
mysql8.0之后,没有查询缓存了
AST抽象语法树
查询缓存
日志
服务端日志,binlog
存储引擎端日志
innodb,redolog,用于前滚
wal,write ahead log
log buffer,属于用户空间
undo log,用于回滚
binlog-服务端日志
redo是innodb独有,binlog所有引擎通用
redo是物理日志,记录某个数据页做了什么修改;binlog是逻辑日志,记录语句原始逻辑