zoukankan      html  css  js  c++  java
  • 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 这样

  • 相关阅读:
    BZOJ 1029 & 丝帛贪心
    BZOJ 1831 & 就是一个DP....
    HDU2138 & 米勒拉宾模板
    BZOJ 2733 & splay的合并
    hdu Matrix Multiplication 写一个类似哈希函数的东西一切就解决了。
    hdu Cow Sorting 数学题(值得思考)
    Find them, Catch them 并查集
    Buy Tickets 简单的线段树&&反向更新
    Who Gets the Most Candies? 线段树的建立更新和反素数
    Apple Tree 有时间戳的树状数组
  • 原文地址:https://www.cnblogs.com/bj-xiaodao/p/10989930.html
Copyright © 2011-2022 走看看