Mysql 聚簇索引和非聚簇索引的区别

聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。
一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引。

在《数据库原理》一书中是这么解释聚簇索引和非聚簇索引的区别的:
聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。

https://blog.csdn.net/alexdamiao/article/details/51934917

聚簇索引:将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据【每个表都有且只有一个聚簇索引】

非聚簇索引:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置【每个表都可以没有非聚簇索引,也可以有多个非聚簇索引】

在innodb中,在聚簇索引之上创建的索引称之为辅助索引,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引。辅助索引叶子节点存储的不再是行的物理位置,而是主键值,辅助索引访问数据总是需要二次查找

  1. InnoDB中,聚簇索引将主键组织到一棵B 树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B 树的检索算法即可查找到对应的叶节点,之后获得行数据。
  2. 若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B 树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B 树种再执行一次B 树检索操作,最终到达叶子节点即可获取整行数据。(重点在于通过其他键需要建立辅助索引)

聚簇索引具有唯一性,由于聚簇索引是将数据跟索引结构放到一块,因此一个表仅有一个聚簇索引。

表中行的物理顺序和索引中行的物理顺序是相同的在创建任何非聚簇索引之前创建聚簇索引,这是因为聚簇索引改变了表中行的物理顺序,数据行 按照一定的顺序排列,并且自动维护这个顺序;

聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个唯一且非空的索引代替。如果没有这样的索引,InnoDB 会隐式定义一个主键(类似oracle中的RowId)来作为聚簇索引。如果已经设置了主键为聚簇索引又希望再单独设置聚簇索引,必须先删除主键,然后添加我们想要的聚簇索引,最后恢复设置主键即可。

MyISAM中聚簇/非聚簇索引的两棵B 树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B 树的节点存储了主键,辅助键索引B 树存储了辅助键。表数据存储在独立的地方,这两颗B 树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树

使用聚簇索引的优势:

每次使用辅助索引检索都要经过两次B 树查找,看上去聚簇索引的效率明显要低于非聚簇索引,这不是多此一举吗?聚簇索引的优势在哪?

1.由于行数据和聚簇索引的叶子节点存储在一起,同一页中会有多条行数据,访问同一数据页不同行记录时,已经把页加载到了Buffer中(缓存器),再次访问时,会在内存中完成访问,不必访问磁盘。这样主键和行数据是一起被载入内存的,找到叶子节点就可以立刻将行数据返回了,如果按照主键Id来组织数据,获得数据更快。

2.辅助索引的叶子节点,存储主键值,而不是数据的存放地址。好处是当行数据放生变化时,索引树的节点也需要分裂变化;或者是我们需要查找的数据,在上一次IO读写的缓存中没有,需要发生一次新的IO操作时,可以避免对辅助索引的维护工作,只需要维护聚簇索引树就好了。另一个好处是,因为辅助索引存放的是主键值,减少了辅助索引占用的存储空间大小。

注:我们知道一次io读写,可以获取到16K大小的资源,我们称之为读取到的数据区域为Page。而我们的B树,B 树的索引结构,叶子节点上存放好多个关键字(索引值)和对应的数据,都会在一次IO操作中被读取到缓存中,所以在访问同一个页中的不同记录时,会在内存里操作,而不用再次进行IO操作了。除非发生了页的分裂,即要查询的行数据不在上次IO操作的换村里,才会触发新的IO操作。

3.因为MyISAM的主索引并非聚簇索引,那么他的数据的物理地址必然是凌乱的,拿到这些物理地址,按照合适的算法进行I/O读取,于是开始不停的寻道不停的旋转。聚簇索引则只需一次I/O。(强烈的对比)

4.不过,如果涉及到大数据量的排序、全表扫描、count之类的操作的话,还是MyISAM占优势些,因为索引所占空间小,这些操作是需要在内存中完成的。

聚簇索引需要注意的地方

当使用主键为聚簇索引时,主键最好不要使用uuid,因为uuid的值太过离散,不适合排序且可能出线新增加记录的uuid,会插入在索引树中间的位置,导致索引树调整复杂度变大,消耗更多的时间和资源。

建议使用int类型的自增,方便排序并且默认会在索引树的末尾增加主键值,对索引树的结构影响最小。而且,主键值占用的存储空间越大,辅助索引中保存的主键值也会跟着变大,占用存储空间,也会影响到IO操作读取到的数据量。

为什么主键通常建议使用自增id

聚簇索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。如果主键不是自增id,那么可以想 象,它会干些什么,不断地调整数据的物理地址、分页,当然也有其他一些措施来减少这些操作,但却无法彻底避免。但,如果是自增的,那就简单了,它只需要一 页一页地写,索引结构相对紧凑,磁盘碎片少,效率也高。

转自:https://my.oschina.net/xiaoyoung/blog/3046779

来源:https://www.icode9.com/content-2-838001.html

(0)

相关推荐

  • B树、B 树详解

    B树 前言 首先,为什么要总结B树.B+树的知识呢?最近在学习数据库索引调优相关知识,数据库系统普遍采用B-/+Tree作为索引结构(例如mysql的InnoDB引擎使用的B+树),理解不透彻B树,则 ...

  • MySQL数据库 InnoDB引擎的索引原理概述与设计索引调优简述

    MySQL的InnoDB引擎比较常用,了解它的索引原理,才能在设计索引的时候得心应手,轻松应对数据库表的优化. 1.聚集索引 也叫聚簇索引. 1.1.必然会有聚集索引 聚集索引 != 主键索引: 任何 ...

  • b树和b+树的区别

    转载自https://blog.csdn.net/login_sonata/article/details/75268075 一,b树 b树(balance tree)和b+树应用在数据库索引,可以认 ...

  • B-Tree 和 B+Tree傻傻分不清楚

    B-Tree B-Tree又叫做B树,和平衡二叉树不同的地方在于B树是多叉树(平衡多路查找树),Oracle和MongoDB的索引技术就是基于B树的数据结构,B树也可以看作是对2-3查找树的一种扩展. ...

  • Mysql中的索引

    Mysql中的索引

  • 数据库索引

    索引(index)是帮助MySQL高效获取数据的数据结构.常见的查询算法:顺序查找.二分查找.二叉树查找.哈希散列.分块查找.B树. 1)哈希算法:就是把任意长度值(key)通过散列算法变成固定长度的 ...

  • 什么情况?MySQL居然有中“8种”索引?

    关于MySQL索引相关的内容,一直是一个让人头疼的问题,尤其是对于初学者来说.笔者曾在很长一段时间内深陷其中,无法分清"覆盖索引,辅助索引,唯一索引,Hash索引,B-Tree索引--&qu ...

  • innodb聚簇索引和myisam非聚簇索引

    通俗点讲 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内 ...

  • Mysql聚簇索引和非聚簇索引

    在mysql数据库中,myisam引擎和innodb引擎使用的索引类型不同,myisam对应的是非聚簇索引,而innodb对应的是聚簇索引.聚簇索引也叫复合索引.聚集索引等等. 聚簇索引:" ...

  • 拼多多智能推广和非智能的区别

    对新手而言注册店肆并非难事,真实的难点在于店肆运营,在详细点便是引流,面临渠道的众多工具,你不只要了解,还要娴熟运用,发挥其最大价值,但许多的新手商家在运用拼多多的付费推广多多查找时,面临查找智能推广 ...

  • 1分钟看懂季风区与非季风区的区别

    1分钟看懂季风区与非季风区的区别

  • 80水苏糖与非80水苏糖区别何在?认真读完本文就懂

    [作者:岳远卿] 所谓水苏糖,是指天然存在植物提取的一种四糖,是一种能以40-103倍速度增殖益生菌的功能性低聚糖.水苏糖纯品为白色粉末,甜度为蔗糖的22-28%,味道纯正,无任何不良口感或异味. 众 ...

  • 独生子女和非独生子女的区别

    你知道最大的区别是什么吗? 区别就是 独生子女的话你就是家里的宝 家里所有的吃的喝的 没人跟你抢 都是你的 所以就会出现 你去了人家只有一个孩子的家庭 零食饮料放在那儿就没人吃

  • “那蛇有毒吗?”毒蛇与非毒蛇的区别

    如果你在生活中或旅行时偶然发现了一条蛇,很有可能你第一眼就不知道它是否有毒. 如果你能抑制住想要逃跑或杀死它的冲动,再看久一点. 肉眼检查有助于确定蛇是否会构成危险. 从安全的距离看: 它头的形状 这 ...

  • 甾体和非甾体的区别

    病情分析:甾体和非甾体类药物都包含抗炎作用,但是两者明显区别:1.从作用机制来说,非甾体类抗炎药,通过抑制环氧化酶.减少前列腺素的合成,而甾体类抗炎药主要是稳定溶酶体膜.同时抑制前列腺素以及花生四烯酸 ...

  • 开源SCI与非开源如何区别

    联系我们,有惊喜!! 本公众号提供:sci论文,母语翻译编审润色.选刊投稿发表指导.课题申报服务.如需了解详情,请加责编微信:xueshuzhishi SCI期刊分为开源SCI期刊和非开源SCI期刊. ...