缓冲池
基于磁盘
的数据库系统都会有缓冲池
(页/块)
写操作,将页读入缓冲池,在缓冲池中对页进行修改,修改后的页,异步写入磁盘
每个存储引擎,都有自己的缓冲池
由于磁盘是顺序读取,InnoDB引擎中,根据区
来管理页
(1个区有连续64页),区与区之间不一定连续。
B+树只能查找到记录所在的页,再根据二分查找找到记录所在页的具体位置
B+树【直接存储介质】既是平衡二叉树(只有叶子节点保存数据->这是和B-树的区别),记录节点之间通过指针连接,通过旋转减少拆分(页拆分意味磁盘操作),通过填充因子(50%)来减少磁盘合并操作
平衡二叉树【内存存储结构】查询快,维护需要旋转复杂
优点:
- 更少的查找次数,出度大,高度小
- 磁盘预读特性,将索引的一个节点的大小设置为操作系统页的大小,使得一次 I/O就能完全载入一个节点。并且可以利用预读特性,相邻的节点也能够被预先载入
InnoDB每个页大小16KB,B+树高度在2~4层(没层都是一次IO操作)
聚集索引
叶子节点
存放的是行数据本身
排序:因为聚集索引已经是排好序的,所以无需再进行排序操作。
范围:我们只需要找到范围的两端,且由于叶子节点是一个双向链表,且是数据本身,所以两端叶子之间的叶子节点就是数据
InnoDB中用到的索引是B+树
非聚集索引
叶子节点
存放的是聚集索引的值
所以对非聚集索引的查找[通常情况下]至少要经过两次B+树的遍历。且范围查找时,找到所有符合条件的聚集索引值之后,需要依次对每个聚集索引值找到对应的数据
高度更高,存储的键值更多
联合索引
(a,b)索引时,可以单独查a也会走索引
。而如果单独查b则不会走索引
索引范围
可以使用explain
来查看优化器结果
当查询的数据量超过20%的时候,优化器会选择直接走聚集索引
网友评论