• 密集索引和稀疏索引的区别


    密集索引和稀疏索引的区别

    a)密集索引文件中的每个搜索码值都对应一个索引值,其叶子节点保存不仅仅是键值,还保存了位于同一行记录里的其他列的信息,由于密集索引决定了表的物理排列顺序,一个表只能有一个物理排列顺序,所以一个表只能创建一个密集索引。

    b)稀疏索引文件只为索引码的某些值建立索引项,其叶子节点仅保存了键位信息以及该行数据的地址或者主键。

    咱们来对MySql做具体分析,mysql主流的两种存储引擎,一种是MyISAM,另外一种是Inodb,前者不管是主键索引,唯一键索引或者普通索引,其索引均属于稀疏索引,而InnoDB必须有且只有一个密集索引:

    a) 若一个主键被定义,该主键则作为密集索引

    b) 若没有主键被定义,该表的第一个唯一非空索引则作为密集索引

    c) 若不满足以上条件,InnoDB内部会生成一个隐藏主键(密集索引)

    d) 非主键索引存储相关键位和其对应的主键值,包含两次查找

    如上图,InnoDB使用的是密集索引,将主键组织到一颗B+Tree中,而行数据就存在叶子节点上,因为InnoDB的主键索引和对应的数据是保存在同一个文件当中的,所以检索的时候在加载叶子节点的主键进入内存的同时,也加载了对应的数据,即若使用 where id = 14 这样的条件查询主键,则按照B+Tree的检索算法即可查找到对应的叶子节点并获得对应的行数据;若对稀疏索引进行条件筛选,则需要经过两个步骤,第一步在稀疏索引的B+Tree中检索该键,对应到主键信息,第二步是根据找到的主键信息在B+Tree中再执行一遍B+Tree的索引操作,最终再到达叶子节点获取整行的数据。

    MyISAM使用的均为稀疏索引,其主键索引和其他辅助键索引的两颗树看上去没什么不同,节点的结构完全一致,只是存储的内容不一样而已,主键索引B+Tree的节点存储了主键, 辅助键索引B+Tree的节点存储了辅助键,表数据存储在独立的地方,也就是索引和数据是分开存储的,这两类索引的B+Tree叶子节点都使用地址指向真正的表数据,对于表数据来说,这两类键没有任何的差别。

    更多内容请扫描二维码关注“码农TT”

  • 相关阅读:
    【PHP框架CodeIgniter学习】使用辅助函数—建立自己的JSONHelper
    mysql将字符转换成数字
    ***微信浏览器禁止app下载链接怎么办
    十分钟帮你拿到500万天使轮!手把手教你写商业计划书【干货】
    ***PHP各种编码的汉字字符串截取
    Nginx与Redis解决高并发问题
    hrtimer的简单使用 + 原理和实现【转】
    2.6 内核中的计时器和列表【转】
    Linux输入子系统:多点触控协议 -- multi-touch-protocol.txt【转】
    kthread_create与kernel_thread的区别【栈】
  • 原文地址:https://www.cnblogs.com/liermao12/p/10504120.html
Copyright © 2020-2023  润新知