• mysql索引数据结构


    1. 索引是帮助mysql高效获取数据的排好序的数据结构
    2. B+Tree(B-Tree)
      • 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
      • 叶子节点包含所有索引字段
      • 叶子节点用指针连接(双向)-便于范围查找,提高取件访问的性能
        image
    1. MYISAM索引文件和数据文件是分离的(非聚集),一个表包含MYD(数据),MYI(索引),frm(表结构)三个文件
      1. 判断where后的条件是否是索引字段,否则全表扫描
      2. 是索引字段,在MYI文件索引的根目录下查找目标值,获取该条数据的磁盘文件地址
      3. 根据地址在MYD文件获取该数据

     

    image

    1. InnoDB索引实现(聚焦)
      • 表数据文件本身就是按B+Tree组织的一个索引文件

    image.png

      • 聚集索引-叶节点包含了完整的数据记录,非聚集索引-叶节点包含了数据的地址

    InnoDB是聚集索引,MYISAM是非聚集索引,聚集索引相比非聚集索引查询效率要高一些

      • 为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?

    如果没有建立主键,mysql会对数据表的列从左到右进行查找,找到符合唯一索引的列作为主键处理,如果没有这样的列,mysql会新增一个隐藏列;使用整型的自增主键比较大小更快,且占用的存储空间更小(如uuid,字符串比较大小更复杂,且占用的存储空间更大)

      • 为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

    截屏2020-10-12 下午6.53.05.png

    非主键索引先根据索引列找到主键值,再根据主键值扫描主键索引树,一共扫描两棵索引树

      • 联合主键索引数据结构

    截屏2020-10-12 下午7.02.08.png

    首先比较第一列索引的值,如第一列的值相同,再比较第二类索引的值,以此类推

     

    1. Hash索引实现
      • 首先将索引的值作hash运算得到散列值,根据散列值可以直接获取存储此条记录的磁盘文件指针,此方法效率很高,但致命缺点是无法实现范围查找

    截屏2020-10-12 下午7.12.08.png

  • 相关阅读:
    Matplotlib.pyplot 三维绘图
    Matplotlib.pyplot 二维绘图
    面对对象进阶
    面对对象基础
    python安装第三方模块
    json & pickle
    os模块
    sys模块
    正则表达式
    Python2与Python3的编码差异
  • 原文地址:https://www.cnblogs.com/sbrn/p/13807227.html
Copyright © 2020-2023  润新知