mysql引擎
- 物理存储格式 compact: SHOW TABLE STATUS
存疑
- 每一次插入数据时,是不是都要重新对所有的索引树设置?
- 叶子节点的数据时保存在哪里的,内存中?如果没有找到数据,要如何去磁盘中获取数据?获取之后,是不是有时间有效期,有效期过了,就将该部分内存释放?
- 如果全表查询,数据都加载到内存中?
查询的时候,先把磁盘的数据加载到bufferPool缓存,然后更新的时候,更新bufferPoll,同时维护一堆链表,然后定时或者不定时的根据flush和lru链表,将bufferPool里的更新过的脏数据刷新到磁盘上
- 数据插入的时候,是如何存放磁盘的?将相邻的key值存放在一起,之前的数据进行移动?
为什么要用B+树进行mysql索引设计呢?
- 1.B+tree能很好的利用操作系统和磁盘的交互特性,mysql将页设置为16k,一次io就可以将一个节点(16K)的内容加载到内存中,比如,假设关键字为int类型,则可以大约存储(16*1000)/8=2000个关键字,3层高度可以搜索的关键字个数远远大于二叉树
- 2.B+树保证树的平衡的过程中,每次关键字的变化,都会导致结构发生很大的变化,所以要创建合适的索引
- 3.只有叶子节点才保存数据,其他的节点不保存数据
- 4.查询速度更稳定,天然具备排序功能,全节点遍历更快
MyIsam
- 非聚集索引
- 使用的是B+树创建索引,叶子节点保存的是磁盘的地址
- 可以没有主键
- 每一个索引都是一颗树
- 相比Innodb来说,性能好于非主键索引
Innodb
- 聚集索引
- 使用的是B+树索引,叶子节点保存的是实际的数据
- 主键索引创建树,非主键索引构建一棵叶子节点为主键的树,通过找到主键,然后再主键索引树中查找
- 注意事项:
1.索引越离散越好
2.不要创建冗余的索引,尽量的扩展索引,而不是创建索引 3.最小的主键空间,空间越小,则每个节点保存的关键字数据就越多 4.尽量的采用指定列,而不是select * 5.最左匹配原则