浅谈索引底层

Posted _BitterSweet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈索引底层相关的知识,希望对你有一定的参考价值。

索引

索引引入,从磁盘交互角度

首先mysql在运行时与磁盘交互的基本单位是16KB(一个页)

  • MySql中的数据文件是以16KB的page保存在磁盘中的
  • MySql的CURD操作都必须要通过计算,去找到对应的插入位置,修改位置,查询数据的位置,这个过程的计算是需要CPU的参与,把数据移动到内存中
  • 所以在特定的时间内,数据一定是在磁盘中有,内存中也有,后续再以一定的刷新策略刷新到磁盘,这里涉及到内存和磁盘的数据交互就是IO过程
  • 所以在MySql服务器运行的过程中,会在内存中开辟一个缓冲区BufferPool,为了最大化地提高效率并尽量减少和磁盘的IO次数,所以引入了索引
  • Page分为目录页和数据页,目录页存放各个下级Page的最小键值,查找的时候,查找的时候,自顶向下寻找,只需要加载部分目录页进内存就可以了,都是在B+树的叶子节点命中,只需要B+树深度次的IO,这样的话,就必然要把索引的数据结构的高度尽量降低,这就是B+树

InnoDB在建立索引数据结构时,为什么用其他不行?

  • AVL平衡二叉树:树的高度过高,索引查询需要访问磁盘,每次访问以节点为单位进行磁盘I/O,需要尽量减少数据读取的I/O操作,所以树的高度不能太高
  • 链表:线性遍历,效率太低
  • BST:插入有序可能退化为单支
  • B树:B+树相比B树有个很大的特点,就是B+树所有关键字都出现在叶子节点的链表中,且链表中的关键字恰好有序,对于范围查找,比如15~50,B树需要中序遍历二叉树,但是B+树直接在叶子节点顺序访问就可以了

B树和B+树最有意义的区别

  • B树的节点既有数据,还有其它数据页的指针
  • B+树只有叶子节点有数据,非叶子节点存的都是键值(key)和数据页的指针(地址)
  • B+树的叶子节点,全部相连,而B树没有
  • 所以B+树作为索引的原因就呼之欲出了:1.非叶子节点不存数据,这样就可以存储更多的key值树数据页的指针,让树变得更矮,IO次数更少一些 2.叶子节点相连便于范围查找

InnoDB,MyISAM区别

  • MyISAM支持的是非聚簇索引,就是把数据和索引分离,B+树叶子节点的数据域存放的是数据的地址
  • InnoDB支持的是聚簇索引(数据与索引放在一起,B+树的叶子节点的数据域存放的是数据)
  • MyISAM建立辅助(普通索引)和主键索引没有区别,无非就是主键不能重复,非主键可以重复
  • InnoDB的辅助(普通索引)索引叶节点中没存数据存的主键值,所以InnoDB通过辅助索引找到目标记录,需要两遍索引:首先检查辅助索引获得主键,然后到主键索引中获得记录,这叫回表查询
  • InnoDB支持事务,MyISAM不支持事务

什么是事务

事务就是一组逻辑上存在相关性DML语句组成,这些语句要么全部成功,要不全部失败
4个属性,原子性、一致性、隔离性、持久性
重点说一下隔离性:数据库允许多个并发事务对齐数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致的数据不一致。
事务的隔离级别:读未提交、读提交、可重复读、串行化

以上是关于浅谈索引底层的主要内容,如果未能解决你的问题,请参考以下文章

浅谈C语言的动态内存开辟

浅谈B和B+树

浅谈——MySQL存储引擎

浅谈HashMap实现原理

浅谈ntp server搭建

java基础