• Mysql之B树索引


    聚集索引: 
    简单概念:一个表中根据主键创建的一棵B+树,索引的叶子节点存放了表中所有的记录,存储记录在物理位置上是连续的,一个叶子节点存放一条对应的记录(PS:是根据主键创建的B+树,叶子节点存数据记录) 。
    举个例子(以汉语字典为例): 
    汉语字典的正文本身就是一个聚集索引,比如我们要查“安”字,由于汉语词典的拼音排序是从“a”开始到“z”结尾的,则“安”字自然而然就排在字典前部,若翻遍了所有以“a”开头的部分仍找不到该字,
    则说明“安”不在字典中;同理,若想查“张”字,我们会将字典翻到最后一部分,因为拼音是“zhang”。而在我们的这些查找中,我们仅仅依靠正文就可以进行相应的查找;也就是说,字典的正文部分本身就是一个目录,我们不需要再通过其他目录的查找来找到我们需要的内容。
    正文内容本身就是按照一定规则排列的目录便称为“聚集索引”。每个表只能有一个聚集索引,因为目录只能按照一种方法进行排列,且每个表的主键是唯一的 。
    非聚集索引:
    简单概念:非聚集索引是根据索引字段创建的一棵B+树,索引的叶子节点仅存放索引键值以及该键值指向的主键,存储记录在逻辑上是连续的(PS:根据索引字段创建的B+树,叶子节点只存放索引键值与记录的主键) 
    举个例子(还是以汉语字典为例): 
    当我们遇到不认识的字且不知道它的发音,这时候,我们就不能按照前面的方法找到要查的字,而是需要根据“偏旁部首”查找要找的字,然后根据这个字后的页码直接翻到某页来找到要找的字,但我们结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,
    比如我们查“张”字,在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“弛”字,但页面却是63页,“张”的下面是“弩”字,页面是390页,很显然,
    这些字在正文中并不是真正的分别处于“张”字的上下方,现在看到的连续的“弛,张,弩”三字的顺序实际上就是它们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射,我们可以通过这种方式来找到所需要的字,但这包含2个过程,
    先找到目录中的结果,再根据找到的结果来翻到我们所需要的页面,这种目录纯粹是目录,正文纯粹是正文的排序方式就是“非聚集索引” 。
    聚集索引与非聚集索引的主要区别: 
    a.存储特点的区别: 
    聚集索引按索引顺序来存储,索引项顺序与表中记录的物理顺序一致,叶子节点即存储了真实数据行,不再有另外的单独数据页,一张表上最多只有一个聚集索引; 
    非聚集索引表的存储顺序与索引顺序无关,仅仅索引项的逻辑上是连续的,叶子节点存储了索引字段值以及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致。 
    
    b.更新表数据的区别: 
    插入数据:无聚集索引的表,表中数据行没特定顺序,新行皆被添加到表的末尾;有聚集索引的表,先根据索引找到对应的数据页,挪动已有记录为新数据腾出空间后插入,若数据页已满,则拆分数据页,调整索引指针(若表中有非聚集索引,则更新索引指向新的数据页); 
    删除数据:无聚集索引的表,直接删除(留下内存空洞);有聚集索引的表,删除行将导致其下的数据行向上移动以填补空白,若删除的行为数据页最后一行,则回收该数据页,相应索引页中记录也被删除。 
    InnoDB的B+树索引: 
    a.InnoDB是索引组织表的,即数据文件本身就是按照B+树方式存放数据的; 
    b.InnoDB引擎中可以有聚集索引与非聚集索引,这2种索引每个页大小都为16k,且不能更改; 
    c.由于非聚集索引不包含行记录所有数据,因此每页可以存放比聚集索引更多的键值,高度一般都小于聚集索引; 
    d.若在InnoDB表建立时没显式指定主键,则InnoDB会自动创建一个6字节的列作为主键; 
    e.InnoDB中,主键的值会附加在每个非主键索引(非聚集索引)对应记录后面,无需重复添加到覆盖索引列中,这也是为什么我们常说InnoDB主键长度越小越好; 
    f.若非聚集索引是包含主键的联合索引,也不需要一个额外的列存放主键值,它会通过联合索引中的主键进行查找。 
    小图一张,展示下InnoDB中聚集索引与非聚集索引的关系 。

    MyISAM 的B+树索引: 
    a.MyISAM是堆组织表,没有聚集索引的概念; 
    b.MyISAM表所有的行数据都存放在MYD文件中,B+树索引都存放在MYI文件中,且都是非聚集索引; 
    c.主键索引与其他索引不同之处在于必须是唯一的,且不可为null,索引页大小为1k,且不可调整; 
    d.由于没有聚集索引,故其索引叶节点存放的键值不是主键值,而是对应记录在MYD文件中的物理位置; 
    这也是为什么MyISAM表记录删除之后数据文件大小没什么变化,留下内存碎片,造成“空洞”的现象(可用 “OPTIMIZE TABLE 表名” 进行定期清理,会锁表)。 
    小图一张,展示下MyISAM中MYD与MYI的关系 

  • 相关阅读:
    顶级jQuery树插件
    jQuery 表格
    FlexiGrid使用手册
    gif动图快速制作方法(附工具)(转)
    Maven搭建SpringMVC+Hibernate项目详解(转)
    Gradle cookbook(转)
    Gradle入门系列(转)
    Gradle构建多模块项目(转)
    oracle中imp命令具体解释
    DisplayContent、StackBox、TaskStack笔记
  • 原文地址:https://www.cnblogs.com/cbxBlog/p/9192970.html
Copyright © 2020-2023  润新知