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

  • 相关阅读:
    什么是反向代理,反向代理有什么好处?
    动态的favicons
    管理emacs dotemacs文件
    自己的部分小软件合计 2000 2013(很久没有更新了)
    经典CSS 横向导航菜单【下载】
    Web 调试,兼容浏览器的在线调试(系列)
    sql server 执行大脚本时报警告没有足够的内存继续执行程序
    c#对接顺丰图片文件
    Sql Server行转列 动态拼接sql
    centos6.2更新yum源
  • 原文地址:https://www.cnblogs.com/sbrn/p/13807227.html
Copyright © 2011-2022 走看看