MySQL 数据库专家python

Mysql索引原理

2019-01-17  本文已影响72人  黄靠谱

参考出处

陈Chuan大佬系列,简书过500赞的博客
https://www.jianshu.com/p/d7665192aaaf

一文看懂 聚簇索引、非聚簇索引 和InnoDB和Myisam的区别
https://blog.csdn.net/lisuyibmd/article/details/53004848

Mysql B+树的插入删除,看这一篇就够了,有图有真想
https://blog.csdn.net/sunshine_lyn/article/details/82747596

概论

image
image

几个概念:

聚集索引

  1. 聚集索引就是叶子节点的顺序和物理存储的顺序是一样的,所以范围查找的时候效率很高,但是DML操作的时候,为了维护物理存储的顺序和叶子节点一样,涉及到大量的数据位移调整。

  2. 聚簇索引的顺序就是数据的物理存储顺序,所以一个表最多只能有一个聚簇索引,因为物理存储只能有一个顺序。正因为一个表最多只能有一个聚簇索引,所以它显得更为珍贵,一个表设置什么为聚簇索引对性能很关键

举例:主键为id的表中,范围查找 where id<1000 and id>200
则只需要找到ID=200和 ID=1000的叶子节点对应的位置,捞取数据块中间的所有的数据,就是要查找的范围数据了。但是如果以前没有ID=300这个数据,现在新增一个ID=300的数据,那么 ID>300的所有的数据都要往后挪一个位置。

树形结构科普

https://blog.csdn.net/zwz2011303359/article/details/63262541

  1. 传说中的叶子节点,指的是最外层的节点,就像一棵树,只有最外层的节点才长叶子

  2. 二叉搜索树的特点:

  1. B-Tree的特点

B+树的结构特点

  1. B+树索引并不能找到一个给定键值的具体行,它找到的只是被查找数据行所在的页,接着数据库会把页读入到内存,再在内存中进行查找,最后得到要查找的数据。数据的读取是精确到页的,因为页是计算机管理存储器的逻辑块,IO的磁盘读取,每次都读取数据的大小是一个页大小的整数倍。
  2. 假设B+Tree的高度为h,一次检索最多需要h-1次I/O(根节点常驻内存),复杂度O(h) = O(logmN),m指的是一个节点存储的数据的个数。实际应用场景中,M通常较大,常常超过100,因此树的高度一般都比较小,通常不超过3。
  1. B+树与B树的不同在于:
  1. 为什么数据库使用B+而不使用红黑树呢?
  1. 为什么mysql的索引使用B+树而不是B树呢?

B+树插入和删除的逻辑

https://blog.csdn.net/sunshine_lyn/article/details/82747596

  1. 插入:和红黑树特别像,新数据插入到一个满了的节点中时,会优先进行左旋右旋,如果邻近的节点都满了的话,会取中间的一个key往上一个层级插入,直至到Root节点,树的高度的增加,都是通过根节点的拆分来完成的,这保证了所有左右节点的高度差不超过1
  2. 删除:会进行调整优化树形结构,使树的数据更分散,以及降低树的高度。比如如果该节点的数据过少,可以从邻近的节点左旋 右旋数据来填充。可能的话,降低一个树的高度。

为什么Mysql不选择Hash索引?

Hash索引的优势是精确查找的话,速度会更快,为什么不选择Hash索引

  1. Hash索引不适合范围查找,而B+树特别适合范围查找(特别是聚簇索引的时候)
  2. Hash索引每次查询要加载所有的索引数据到内存当中,而B+树只需要根据匹配规则选择对应的叶子数据加载即可
  3. 另外B+树引入了缓存机制 和 数据页技术来提升性能(不过理论上来说,这两个特性Hash索引也可以实现)

如果你觉得对你有帮助的话,就给我点赞吧!

上一篇 下一篇

猜你喜欢

热点阅读