MySQL学习(三)

索引结构

我们都知道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 这样

原文地址:https://www.cnblogs.com/bj-xiaodao/p/10989930.html