MySql的索引机制

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.最左匹配原则

参考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章