zoukankan      html  css  js  c++  java
  • mysql 13 B+tree中存储数据的格式 页

    知识储备:

         通过前面的介绍,我们已经知道,索引分为聚簇索引和非聚簇索引,mysql的所有数据都保存在聚簇索引里,B+tree的非叶子节点存的是键值和指针(指向数据页)

    有了了解后,我们再专门来说一下,mysql的数据页

          我们都知道计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位是一毛。在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统(例如XFS/EXT4)他的最小单元是块,一个块的大小是4k,而对于我们的InnoDB存储引擎也有自己的最小储存单元——页(Page),一个页的大小是16K。

    磁盘扇区、文件系统、InnoDB存储引擎都有各自的最小存储单元。

    mysql页结构大致示意图

    当我们新建一个表的时候表中用户记录部分(user records)部分是空的,在我们插入一条记录后会被记录到其中,直到插入满时会把记录信息刷入到下一个页中,

    循环往复。。。

    其中 User Records 存储行记录,是一个单向链表

     真实存储的数据,1,2,3,4可能存放位置非上面顺序的(位置乱的),但都会是一个单向链表串起来的数据

    不论我们怎么做增删改操作,InnoDB对页中的数据始终会维护一个单项链表,链表中各个节点是按照主键值由小到大的顺序来存储的

    页与页之间,是通过双向链表来连接的

    每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的,然后再遍历该槽对应分组中的记录即可快速找到指定的记录

    其他列(非主键)作为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录

    所以说,如果我们写 select * from user where username='丙丙'这样没有进行任何优化的sql语句,也没用到任何索引,默认会这样做:

    1 定位到记录所在的页: 需要遍历双向链表,找到所在的页

    2 从所在的页内中查找相应的记录: 由于不是根据主键查询,只能遍历所在页的单链表了

    很明显,在数据量很大的情况下这样查找会很慢

  • 相关阅读:
    Holiday、Vacation、Days off、Leave、Break
    python3对urllib和urllib2进行了重构
    python解析json
    NeuHub图像垃圾分类api和百度图像识别api
    base64加密与解密
    wafer2的keng
    HTTP 中 GET 与 POST 的区别
    如何禁用Antimalware Service Executable
    通过SimpleHTTPServer实现树莓派与主机传输文件
    电脑通过网线连接树莓派
  • 原文地址:https://www.cnblogs.com/hup666/p/13419897.html
Copyright © 2011-2022 走看看