索引结构
我们都知道MySQL innodb myisam 都得索引结构是用的b+tree 来实现的,但是我们为什么不适用hash表来实现呢?
hash表在单独取出数据的时候非常快速,但是不支持范围查找 举个例子来说
你存放进去一个数据 根据hash在某个位置,下一次取出的时候,可以直接取出来.但是不能对这个数据进行一个范围查找,因为hash是散列存放的
为什么不用平衡二叉树?
拒教程讲的是找一次需要进行一次磁盘IO?我有点不懂,为什么不直接全部加载然后一次Io就可以了
B树:
一个节点可以放置多个节点,这里可以设置度的概念.树的深度比二叉树低.简而言之减少磁盘IO
同2-3树的性质是一样的这里我就不贴图了
B+树
b+树查找为什么快https://blog.csdn.net/samll_snail/article/details/89445749#commentBox
B+树的叶子节点冗余非页子节点.可以利用树结构的快速查找,比如查找大于0003的数据,那么利用树结构找到0003 然后找到叶子叶子节点的链表,从而找到之后的数据
要理解索引是如何加载的,首先了解磁盘IO的本质
机械硬盘
固态硬盘
本质的区别.机械硬盘 使用机械来读取, 固态硬盘,用的是电路板
机械硬盘读取的时候先获取一个读取的名称然后寻道->找到扇区
计算机局部性原理和磁盘预读
计算机中著名的局部性原理:当一个数据被用到的时候,其附近的数据也会马上被使用
为了提高效率,磁盘不会严格的按需读取,而是每次都会预读,即使读取一个字节,磁盘也会从这个位置顺序的往后读取一定的长度数据放入内存!
这里的一定长度叫做页,也是操作系统读取磁盘的基本单位.
一般操作系统都是的页是4kb的大小 getconf PAGE_SIZE
总结:
b树或者b+树 正好是页单位的倍数比较好
B+树在innodb中的存储是直接在叶子节点存的数据在其他索引是存的数据的地址
在innodb中数据基本单位也是页 大小是16kb,在b+树中一个树节点也是一页
在B+树中假设 一行是1kb的话一页是16kb一页就是存16条数据,叶子节点就是存储数据,一个叶子节点可以存16条数据
非叶子节点 只存指针和key
假设bigint(8)和指针(6b)
1170第一层的指针 数据大小1kb 第二层1170*16 这样