精华内容
下载资源
问答
  • 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。...聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。 索引定义中包含聚集索引列。 每个表只能有一个聚集索引,因为...

    索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。 索引包含由表或视图中的一列或多列生成的键。 这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行。

    表或视图可以包含以下类型的索引:

    • 群集

      • 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。 索引定义中包含聚集索引列。 每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。

      • 只有当表包含聚集索引时,表中的数据行才按排序顺序存储。 如果表具有聚集索引,则该表称为聚集表。 如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。

    • 非聚集

      • 非聚集索引具有独立于数据行的结构。 非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。

      • 从非聚集索引中的索引行指向数据行的指针称为行定位器。 行定位器的结构取决于数据页是存储在堆中还是聚集表中。 对于堆,行定位器是指向行的指针。 对于聚集表,行定位器是聚集索引键。

      • 您可以向非聚集索引的叶级添加非键列以跳过现有的索引键限制(900 字节和 16 键列),并执行完整范围内的索引查询。 有关详细信息,请参阅 Create Indexes with Included Columns

    转载于:https://www.cnblogs.com/Fred1987/p/5939970.html

    展开全文
  • 转载自 InnoDB 的辅助索引叶子节点为什么不直接保存的记录地址而要主键键值 RT,最近看书关于innodb的 InnoDB是索引组织表,所以完整的数据记录都存在聚集索引的叶子节点上 辅助索引的叶子节点保存的是对应的...

    转载自  InnoDB 的辅助索引叶子节点为什么不直接保存的记录地址而要存主键键值

    RT,最近看书关于innodb的
    InnoDB是索引组织表,所以完整的数据记录都存在聚集索引的叶子节点上
    辅助索引的叶子节点保存的是对应的主键键值,而另外一种存储引擎myisam叶子节点保存的是记录的地址

    我的问题是InnoDB 的辅助索引叶子节点为什么不直接保存的记录地址而要存主键键值?(导致在使用辅助索引的查询中要两次访问索引)

    ps:想到的一个可能原因是 update 非索引列时,不需要更新辅助索引页,不知道还有没有其它原因?

    (1)
    本身innodb是以主键为主排序的表。。所以对于innodb来讲,其在磁盘的排序已经由主键的顺序定了,不能再按其它健排序。

    其实辅助索引只要主键也有它的优点:一个磁盘块能存储更多的键值,使其在进行索引查找是,只需要读取相对少量的磁盘块就能扫描完全表,加之读到主键,再查询记录是比较快的。

    根本原因是INNODB是主键的索引组织表,其物理存储已经由主键决定,不能再改变在磁盘中的存储顺序。

    (2)
    “一个磁盘块能存储更多的键值”
    这个未必吧,还得取决于主键和地址的大小,地址一般由 文件号+块号+块内偏移组成,大概10个字节
    不过也可以作为一个考虑因素,谢谢你的回复

    (3)

    个人也觉得是跟DML有关,当对一个innodb表进行大量DML后,B+树会分裂,同一行记录的页地址会发生变化。
    由于辅助索引记录的是主键值,因此完全不用理会这个变化,如果辅助索引记录的是实际页地址,那DML一旦引起B+树分裂,还得与辅助索引进行同步。

    展开全文
  • 聚集索引聚集索引 数据结构

    千次阅读 2018-10-02 21:17:42
    Sql Server中的表组织和索引组织(聚集索引结构,非聚集索引结构,堆结构) ...聚集索引是按B树结构进行组织的,B树中的每一页称为一个索引节点。每个索引行包含一个键值和一个指针。指针指向B树上...

    Sql Server中的表组织和索引组织(聚集索引结构,非聚集索引结构,堆结构)

    参考文献

    表和索引数据结构体系结构

    SqlServer存储结构组织其分区中的数据或索引页

    漫谈数据库索引

    正文

    SqlServer用三种方法来组织其分区中的数据或索引页:

    1、聚集索引结构

    聚集索引是按B树结构进行组织的,B树中的每一页称为一个索引节点。每个索引行包含一个键值和一个指针。指针指向B树上的某一中间级页(比如根节点指向中间级节点中的索引页)或叶级索引中的某个数据行(比如中间级索引页中的某个索引行指向叶子节点中的数据页)。每级索引中的页均被链接在双向链接列表中。数据链内的页和行将按聚集索引键值进行排序,聚集索引保证了表格的数据按照索引行的顺序排列

    补充(PS:2012-7-9)

    从上图可以看出,聚集索引的叶子节点是由数据页组成的,表中所有的数据都包含在了聚集索引的叶子节点当中。这也是为什么前一篇博客中提到“If the index is a clustered index then an index scan is really a table scan.”的原因。

    补充(PS:2012-7-13)

    今天突然理解为什么说聚集索引是带真实数据的。这是因为数据本身也是索引的一部分了。数据内容本身按照一个规则排列,那么排列规则+数据就组成了聚集索引。

     

    举例:

           汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。如果正文内容本身就是一种按照一定规则排列的目录,则称之为“聚集索引”。

    2、堆结构

    堆是没有聚集索引的表,用"索引分配映射(IAM)"页将堆的页面联系在一起。如下图所示

     

    堆内的数据页和行没有任何特定的顺序;页面也不链接在一起,数据页之间唯一的逻辑连接是记录在IAM页内的信息,页面与页面之间没有什么紧密的联系;用IAM页查找数据页集合中的每一页。从数据存储管理上来讲,用堆去管理一个超大的表格是比较吃力的,经常使用的表格上都建立聚集索引。

    sql server默认是在主键上建立聚集索引的。就是可以让您的数据在数据库中按照id进行物理排序,但这样做意义不大,聚集索引的优势是很明显的,而每个表中只能有一个聚集索引的规则,这使得聚集索引变得更加珍贵。因为很少用id号来进行查询,这就使让id号这个主键作为聚集索引成为一种资源浪费。

    3、非聚集索引

    非聚集索引与聚集索引具有相同的 B 树结构,但是他们之间还是存在显著差异,主要有一下三点:

    • 非聚集索引不影响数据行的顺序。
    • 基础表的数据行不按非聚集键的顺序排序和存储,
    • 非聚集索引的叶层是由索引页而不是由数据页组成,非聚集索引不会去改变或改善数据页的存储模式。

    既可以使用聚集索引来为表或视图定义非聚集索引,也可以根据定义非聚集索引。非聚集索引中的每个索引行都包含非聚集键值行定位符此定位符指向聚集索引或堆中包含该键值的数据行。

    非聚集索引行中的行定位器可以是指向行的指针,也可以是行的聚集索引键,具体根据如下情况而定:

    • 如果表是堆(意味着该表没有聚集索引),则行定位器是指向行的指针。该指针由文件标识符 (ID)、页码和页上的行数生成。整个指针称为行 ID (RID)。
    • 如果表有聚集索引或索引视图上有聚集索引,则行定位器是行的聚集索引键。如果聚集索引不是唯一的索引,SQL Server 将添加在内部生成的值(称为唯一值)以使所有重复键唯一。此四字节的值对于用户不可见。仅当需要使聚集键唯一以用于非聚集索引中时,才添加该值。SQL Server 通过使用存储在非聚集索引的叶行内的聚集索引键搜索聚集索引来检索数据行。

    补充(PS:2012-7-9)

    从上图可以看出,非聚集索引的叶子节点是由索引页组成的,索引页中每一个索引行的格式是“索引键值+指针”的形式,索引键值就是我们表中的一个列,如果是复合索引,索引键值就是多个列。而指针的具体指向需要根据表的组织结构而定,如果这张表中已经存在聚集索引了,那么指针指向的是聚集索引,如果表中没有加聚集索引,那么这张表就是无序的堆结构,指针指向表中每一条记录所在的位置。因此,索引行跟数据行是一一对应的,假如一个查询中select后面查询的列和where后面的条件列都在索引当中,那么就是索引覆盖,此时不需要再通过索引行的指针去找数据页,直接返回索引页中的内容就可以了。

    举例

    聚集索引与非聚集索引的区分

    区分聚集索引和非聚集索引的一个主要方法是查看叶子节点,如果叶子节点是真实的数据,那么就是聚集索引;如果叶子节点是指针,那么就是非聚集索引。

    如果是在一个有聚集索引的表中使用非聚集索引,那么这个非聚集索引叶子节点指向的是聚集索引的位置,如果没有聚集索引, 那么就指向数据页的rowid,这样的表示无序的,也叫做堆表。

     

    展开全文
  • 聚集索引和非聚集索引

    千次阅读 2018-09-08 14:44:29
    聚集索引和非聚集索引 概念 索引和表的关系 ...​ 众所周知,innodb中索引的组织形式是B+树,非叶子节点存key,叶子节点存key+data,叶子节点之间用指针联通。 ​ 聚集索引则在data存放是数据页 ​...

    聚集索引和非聚集索引

    概念

    ​ 什么是聚集索引?

    ​ 众所周知,innodb中索引的组织形式是B+树,非叶子节点存key,叶子节点存key+data,叶子节点之间用指针联通。

    ​ 聚集索引则在data存放是数据页

    ​ 什么是非聚集索引?

    ​ data中存放的是主键的值,得到主键后还需要在聚集索引上再查询一次

    索引和表的关系

    ​ innodb存储引擎表是索引组织表,这代表着表数据是按主键顺序存放。而每张表都有个主键(没设主键会隐藏生成一个),主键即为聚集索引。那么换句话说,表中数据存储实际上采用的是B+树存储。

    聚集索引和物理存储上的关系

    ​ 很多资料上说聚集索引按照顺序物理存储数据,如果真是这样的话,那么为何这个顺序的开销必然很大,所以并不是物理上连续,而是逻辑上连续。其中有两点,一、前面说数据页通过链表链接,页按照顺序排序,二、页中的记录也是通过链表链接。在物理存储上不按主键存储 –《innodb存储引擎》

    主键和聚集索引的关系

    ​ 如果设置主键那么主键为聚集索引

    ​ 如果没有设置,第一个非空的唯一索引则为聚集索引

    ​ 如果再没有,自动隐藏创建个主键当做聚集索引

    非聚集索引

    ​ 除了聚集索引剩下都是非聚集,聚集索引一张表只有一个,非聚集有很多。

    ​ 非数据索引也是一颗数,在查询的时候先通过非聚集索引数找到主键id,在通过主键id在聚集索引树上找到对应数据

    联合索引

    ​ 创建个索引(A,B,C)其实会创建三个索引,A,AB,ABC,很多资料上说最左前缀法则就能使用上索引

    ​ 如果where C B A则不能,其实不然,mysql当做有个优化器,可以调整条件顺序,只要有开头就能使用上索引,即这个场景下只要有A就能使用索引。

    ​ 如果中间断了 即(C,A)也是可以使用索引,不过有个extra查询消耗

    ​ 不信可自行explain

    覆盖索引

    ​ 因为非聚集索引需要查询两次,但是有种情况是只需要一次的,那就是索引即是返回数据

    ​ 如果定义非聚集索引(A,B)

    ​ 查询的时候select B from tabel where A = 1;

    ​ 那么在B+树中的叶子节点中的key已经存放了A,B的数据,那么这样是可以直接返回的,无需找去查询聚集索引树。

    展开全文
  • 我看书上说,聚集索引叶子节点存数据;非聚集索引叶子节点存指向数据的指针。 InnoDB是聚集索引,MyISAM是非聚集索引。 那**为什么还会有“针对xx字段建立聚集索引还是建立非聚集索引”这种问题啊**? ...
  • mysql聚集索引和非聚集索引区别

    万次阅读 2020-06-03 11:09:45
    聚集索引索引叶子节点的是数据,非聚集索引的叶子节点的是数据的指针。 聚集索引是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储不连续。 聚集索引每张表只能有一个,非聚集索引可以有多个。 ...
  • 聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引叶子节点称为数据页。聚集索引的这个特性决定了索引组织表中数据也是索引的一部分 ...
  • 索引是存储引擎快速找到记录的一种数据结构,是数据库中专门用于帮助用户快速查询数据的一种数据结构,可以帮助用户快速寻找到需要的数据行,是数据库性能优化中最重要的工具。 使用索引的主要目的是为了优化查询...
  • 聚集还是非聚集指的是B+Tree 叶结点存的是指针还是数据记录 MyISAM索引和数据分离,使用的是非聚集索引 InnoDB数据文件就是索引文件,主键索引就是聚集索引 (1)MyISAM引擎 默认是非聚集索引 图解:在叶结点...
  • 聚集索引是按照每张表的主键构造一棵B+树,同时叶子结点中存放的即为整张表的行记录数据,也将聚集索引叶子节点成为数据页。 聚集索引的这个特性决定了索引组织表中的数据也是索引的一部分。同B+树数据结构一样...
  • 聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索
  • 聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,树中的叶子节点存放着表中的行记录数据,因此,也将聚集索引叶子节点称为数据页;非叶子节点中存放着仅仅是键值和指向叶子节点的偏移量。每个叶子...
  • 数据库中B+树索引可分为聚集索引和非聚集索引,不管是索引是否聚集,内部都是B+树,叶子节点存放着所有的数据聚集索引与非聚集索引的不同在于叶子结点存放的是否是一整行的信息。 1.聚集索引 数据行的物理顺序与...
  • 2.非聚集索引:指的是非主键索引,非主键索引叶子节点数据存储的是主键索引的ID,真实数据没有和索引放一起 2)为什么非主键索引存储的是主键索引非真实数据 为了数据的一致性,对一个索引数据进行修改将会导致...
  • 数据按索引顺序存储,叶子节点存储真实的数据行,不再有另外单独的数据页。 在一张表上只能创建一个聚集索引,因为真实数据的物理顺序只能有 1 种,若一张表没有 聚集索引,则他被称为堆集,这样表的数据行无特定的...
  • 聚集索引 聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。一个表只能有一个聚集索引,因为一个表的物理顺序只有一...所以对于聚集索引叶子结点即存储了真实的数据行。所以通过聚集索引可以直
  • 一.索引简介 众所周知,索引是关系型数据库中给数据库表中一列或多列的值排序后的存储结构,SQL的主流索引结构有B+树以及Hash结构,聚集...SQL Sever索引类型有:唯一索引,主键索引,聚集索引,非聚集索引。 MySQL
  • 按照每张表的主键构造B+树,非叶子节点用来存放索引,叶子节点数据页)用来存放行记录数据,按照主键的顺序排序,每个数据页都通过一个双向链表来连接,因此,聚集索引能够在B+树索引的叶子节点上直接找到数据,...
  • 索引的叶子节点就是对应的数据节点 可以直接获取到对应的全部列的数据聚集索引 按照定义,除了聚集索引以外的索引都是非聚集索引聚集索引,分成普通索引,唯一索引,全文索引 非聚集索引叶...
  • 举个最简单的例子,聚集索引就是你查询到叶子节点时,叶子节点存储的就是你想要的数据,直接拿走就可以了。 非聚集索引就是叶子节点存储的就是你想要的数据的一个索引,你需要再回表查询多一次才能拿到想要的数据。 ...
  • MySQL聚集索引和非聚集索引 MySQL的Innodb存储引擎的索引分为聚集索引和非聚集索引两大类,理解聚集索引和非聚集索引可通过对比汉语字典的索引...拼音检索就是聚集索引,因为存储的记录(数据库中是行数据、字典中是汉

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,853
精华内容 6,341
关键字:

聚集索引叶子节点存的是数据