mysql 非聚簇索引的区别_mysql 聚簇索引 和 非聚簇索引 区别 - CSDN
精华内容
参与话题
  • 看完这篇文章应该就能有一个全方位的理解。 具体讲解之前,有一点,再次强调下:B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个...所有叶子结点至多拥有两个儿...

    看完这篇文章应该就能有一个全方位的理解。

    具体讲解之前,有一点,再次强调下:B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是一种树。而事实上是,B-tree就是指的B树。特此说明。

           二叉搜索树:

           1.所有非叶子结点至多拥有两个儿子(Left和Right);

           2.所有结点存储一个关键字;

           3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;

           如:

           

            二叉搜索树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;

    否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入

    右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;

           如果 二叉搜索树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么 二叉搜索树

    的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变 二叉搜索树结构

    (插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;

           如:

          

       但 二叉搜索树在经过多次插入与删除后,有可能导致不同的结构:

       右边也是一个 二叉搜索树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的

    树结构索引;所以,使用 二叉搜索树还要考虑尽可能让 二叉搜索树保持左图的结构,和避免右图的结构,也就

    是所谓的“平衡”问题;      

           实际使用的 二叉搜索树都是在原 二叉搜索树的基础上加上平衡算法,即“平衡二叉树”;如何保持 二叉搜索树

    结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在 二叉搜索树中插入和删除结点的

    策略;

     

     

    B-树

           是一种多路搜索树(并不是二叉的):

           1.定义任意非叶子结点最多只有M个儿子;且M>2;

           2.根结点的儿子数为[2, M];

           3.除根结点以外的非叶子结点的儿子数为[M/2, M];

           4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)

           5.非叶子结点的关键字个数=指向儿子的指针个数-1;

           6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];

           7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的

    子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;

           8.所有叶子结点位于同一层;

           如:(M=3)

           B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果

    命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为

    空,或已经是叶子结点;

    B-树的特性:

           1.关键字集合分布在整颗树中;

           2.任何一个关键字出现且只出现在一个结点中;

           3.搜索有可能在非叶子结点结束;

           4.其搜索性能等价于在关键字全集内做一次二分查找;

           5.自动层次控制;

           由于限制了除根结点以外的非叶子结点,至少含有M/2个儿子,确保了结点的至少

    利用率,其最底搜索性能为:

        

           其中,M为设定的非叶子结点最多子树个数,N为关键字总数;

           所以B-树的性能总是等价于二分查找(与M值无关),也就没有B树平衡的问题;

           由于M/2的限制,在插入结点时,如果结点已满,需要将结点分裂为两个各占

    M/2的结点;删除结点时,需将两个不足M/2的兄弟结点合并;

     

     

     

     

     

    B+树

           B+树是B-树的变体,也是一种多路搜索树:

           1.其定义基本与B-树同,除了:

           2.非叶子结点的子树指针与关键字个数相同;

           3.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树

    (B-树是开区间);

           5.为所有叶子结点增加一个链指针;

           6.所有关键字都在叶子结点出现;

          

       B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在

    非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

           B+的特性:

           1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好

    是有序的;

           2.不可能在非叶子结点命中;

           3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储

    (关键字)数据的数据层;

           4.更适合文件索引系统;

      

    B*树

           是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针;

       B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3

    (代替B+树的1/2);

           B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据

    复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父

    结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;

           B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分

    数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字

    (因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之

    间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针;

           所以,B*树分配新结点的概率比B+树要低,空间使用率更高;

      

    小结

           B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于

    走右结点;

           B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键

    字范围的子结点;

           所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

           B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点

    中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

           B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率

    从1/2提高到2/3;

     

     

    在《数据库原理》里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正是因为如此,所以一个表最多只能有一个聚簇索引。

    mysql中普遍使用B+Tree做索引,但在实现上又根据聚簇索引和非聚簇索引而不同。

    聚簇索引

    所谓聚簇索引,就是指主索引文件和数据文件为同一份文件,聚簇索引主要用在Innodb存储引擎中。在该索引实现方式中B+Tree的叶子节点上的data就是数据本身,key为主键,如果是一般索引的话,data便会指向对应的主索引,如下图所示:

    在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。做这个优化的目的是为了提高区间访问的性能,例如图4中如果要查询key为从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。

    非聚簇索引

     

    非聚簇索引就是指B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。主索引和辅助索引没啥区别,只是主索引中的key一定得是唯一的。主要用在MyISAM存储引擎中

     

     

    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图:

    这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:

     

    同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

    MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。

     
    InnoDB索引实现

    虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。

    第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

    上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
     

    第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。例如,下图为定义在Col3上的一个辅助索引:

    这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

    • MyisAM顺序储存数据,索引叶子节点保存对应数据行地址,辅助索引跟主键索引相差无几(主键索引key不能相同);InnoDB主键节点同时保存数据行,其他辅助索引保存的是主键索引的值;

    了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调(可能是指“非递增”的意思)的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调(可能是指“非递增”的意思)的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

    为什么选用B+/-Tree

    一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。

    B-Tree:如果一次检索需要访问4个节点,数据库系统设计者利用磁盘预读原理,把节点的大小设计为一个页,那读取一个节点只需要一次I/O操作,完成这次检索操作,最多需要3次I/O(根节点常驻内存)。数据记录越小,每个节点存放的数据就越多,树的高度也就越小,I/O操作就少了,检索效率也就上去了。

    B+Tree:非叶子节点只存key,大大滴减少了非叶子节点的大小,那么每个节点就可以存放更多的记录,树更矮了,I/O操作更少了。所以B+Tree拥有更好的性能。

    转载整理自:

    https://blog.csdn.net/u010727189/article/details/79399384

    https://www.jianshu.com/p/7dedb7ebe033

    https://blog.csdn.net/superhosts/article/details/25611119

    http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html

    http://blog.csdn.net/zuiaituantuan/article/details/5909334

    http://www.codinglabs.org/html/theory-of-mysql-index.html

    http://isky000.com/database/mysql_order_by_implement

    http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html

    http://www.docin.com/p-211669085.html

    http://blog.csdn.net/manesking/archive/2007/02/09/1505979.aspx

    展开全文
  • 聚簇索引和非聚簇索引区别对比

    千次阅读 2020-08-28 13:36:59
    非聚簇索引:将数据与索引分开存储,索引结构的叶子节点放的是指向数据的指针(或者说是地址) 在mysql中的应用 innodb的索引都是聚簇索引,其数据直接存放在叶子节点上,但是主键索引(一级索引)叶子节点中存放的...

    释义:
    聚簇索引:将数据与索引放到了一起存储,索引树结构的叶子节点保存了行数据

    非聚簇索引:将数据与索引分开存储,索引结构的叶子节点放的是指向数据的指针(或者说是地址)

    在mysql中的应用

    • innodb的索引都是聚簇索引,其数据直接存放在叶子节点上,但是主键索引(一级索引)叶子节点中存放的就是数据本身,辅助索引的叶子节点上存储的是主键。
    • myisam使用的是非聚簇索引,其叶子节点上不存放数据,存放的是数据的实际地址。
    • 一张表一定只有一个聚簇索引,因为聚簇索引代表了文件的实际存储形式,一张表在磁盘上只会有一种存储结构。
    • 如果没有主键的话,InnoDB 会选择一个现有的唯一且非空的索引代替,如果没有这样的索引,InnoDB 会隐式定义一个主键

    查询的区别

    我们在上一篇文章中已经谈过一些

    • 如果使用的是二级索引(辅助索引)来检索数据,在没有索引覆盖的情况下进行查找,最终拿到的都是主键。拿到主键以后再进行回表查找。
    • 如果使用的是主键索引,最终检索到的就是数据行,叶子节点上的数据之间还形成一种链表结构,方便于顺序范围性的查找数据。

    对比

    聚簇索引相比于非聚簇索引的优势和劣势

    缓存知识介绍

    我们知道一次io读写,可以获取到4k(或者16K,需要看操作系统中的配置)大小的资源,我们称之为读取到的数据区域为Page(页)。当需要查询某个索引的bB+树结构的时候,某些页被加载到内存的缓存区域中,查询操作会在内存里操作,而不用再次进行IO操作了。当要查询的行数据不在缓存里,才会触发新的IO操作。

    聚簇索引优势

    通过上面的缓存知识来看,如果数据存放的位置是相对连续的,则缓存命中率会很高。而聚簇索引正好就是在磁盘上连续存放的。因为MyISAM的主索引并非聚簇索引,那么他的数据的物理地址(硬盘数据区的编号)相对于聚簇索引是比较凌乱的,拿到这些物理地址,按照合适的算法进行I/O读取,于是开始不停的寻道不停的旋转,且存储地址跨度过大,也容易导致缓存命中率低。

    另外,如果数据发生改变,其存储地址很可能也会发生改变。这时候myisam由于索引存放的是存储地址,所以需要更新索引结构。聚簇索引除了主键索引以外的索引,存储的都是主键,主键不发生改变二级索引基本不需要维护,只需要维护主键索引就好了。

    聚簇索引劣势

    但是聚簇索引并不是没有缺点,最显著的缺点就是二级索引查询的时候,都需要查询两次,第一次查询二级索引树,拿到主键,第二次再回表拿到真实的行数据。另外如果说主键选择不当的时候,会容易经常的触发聚簇索引的树结构旋转,重排甚至是页分裂等,所以我们是建议使用自增列来做主键的。

    展开全文
  • 聚簇索引和非聚簇索引区别

    万次阅读 多人点赞 2018-07-25 10:59:51
    参考链接:和刚入门的菜鸟们聊聊--什么是聚簇索引与非聚簇索引 MYSQL索引:对聚簇索引和非聚簇索引的认识 一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引。 在《数据库原理》一书中是这么...

    参考链接:和刚入门的菜鸟们聊聊--什么是聚簇索引与非聚簇索引       MYSQL索引:对聚簇索引和非聚簇索引的认识

    一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引。

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

    因此,MYSQL中不同的数据存储引擎对聚簇索引的支持不同就很好解释了。
    下面,我们可以看一下MYSQL中MYISAM和INNODB两种引擎的索引结构。

    如原始数据为:

    MyISAM引擎的数据存储方式如图:

    MYISAM是按列值与行号来组织索引的。它的叶子节点中保存的实际上是指向存放数据的物理块的指针。
    从MYISAM存储的物理文件我们能看出,MYISAM引擎的索引文件(.MYI)和数据文件(.MYD)是相互独立的。

    而InnoDB按聚簇索引的形式存储数据,所以它的数据布局有着很大的不同。它存储数据的结构大致如下:

    注:聚簇索引中的每个叶子节点包含主键值、事务ID、回滚指针(rollback pointer用于事务和MVCC)和余下的列(如col2)。

    INNODB的二级索引与主键索引有很大的不同。InnoDB的二级索引的叶子包含主键值,而不是行指针(row pointers),这减小了移动数据或者数据页面分裂时维护二级索引的开销,因为InnoDB不需要更新索引的行指针。其结构大致如下:

    INNODB和MYISAM的主键索引与二级索引的对比:

    InnoDB的的二级索引的叶子节点存放的是KEY字段加主键值。因此,通过二级索引查询首先查到是主键值,然后InnoDB再根据查到的主键值通过主键索引找到相应的数据块。而MyISAM的二级索引叶子节点存放的还是列值与行号的组合,叶子节点中保存的是数据的物理地址。所以可以看出MYISAM的主键索引和二级索引没有任何区别,主键索引仅仅只是一个叫做PRIMARY的唯一、非空的索引,且MYISAM引擎中可以不设主键。

     

    【聚簇索引】
    平时习惯逛图书馆的童鞋可能比较清楚,如果你要去图书馆借一本书,最开始是去电脑里面查书名然后根据书名来定位藏书在那个区,哪个书柜,哪一行,第多少本。。。清晰明确,一目了然,因为藏书的结构与图书室的位置,书架的顺序,书本的摆放顺序与书籍的编号都是从大到小一致的顺序摆放的,所以很容易找到。比如,你的目标藏书在C区2柜3排5仓,那么你走到B区你就很快知道前面就快到了C区了,你直接奔着2柜区就能找到了。 这就是雷同于聚簇索引的功效了,聚簇索引,实际存储的循序结构与数据存储的物理机构是一致的,所以通常来说物理顺序结构只有一种,那么一个表的聚簇索引也只能有一个,通常默认都是主键,设置了主键,系统默认就为你加上了聚簇索引,当然有人说我不想拿主键作为聚簇索引,我需要用其他字段作为索引,当然这也是可以的,这就需要你在设置主键之前自己手动的先添加上唯一的聚簇索引,然后再设置主键,这样就木有问题啦。
    总而言之,聚簇索引是顺序结构与数据存储物理结构一致的一种索引,并且一个表的聚簇索引只能有唯一的一条;

     

    【非聚簇索引】
    同样的,如果你去的不是图书馆,而是某城市的商业性质的图书城,那么你想找的书就摆放比较随意了,由于商业图书城空间比较紧正,藏书通常按照藏书上架的先后顺序来摆放的,所以如果查询到某书籍放在C区2柜3排5仓,但你可能要绕过F区,而不是A.B.C.D...连贯一致的,也可能同在C区的2柜,书柜上第一排是计算机类的书记,也可能最后一排就是医学类书籍;

    那么对照着来看非聚簇索引的概念就比较好理解了,非聚簇索引记录的物理顺序与逻辑顺序没有必然的联系,与数据的存储物理结构没有关系;一个表对应的非聚簇索引可以有多条,根据不同列的约束可以建立不同要求的非聚簇索引;

     

     

    动手试试:看看代码怎么敲的

    建立索引之前选好表对象,假设表明为IndexTestTable此表中包含三个字段Id,Name,UniqueCode

    为了更快的进行姓名查询,我们可以在Name字段上添加非聚簇索引;

    创建索引的格式如下:

    CREATE NONCLUSTERED INDEX [index_name【索引名称】] ON [table_name【表名称】]([column_name1【列名称】],[column_name2【列名称】],...);

    我们给IndexTestTable表的Name字段添加一个非聚簇索引

    CREATE NONCLUSTERED INDEX IndexTestTable_index_name ON IndexTestTable(Name);

    给IndexTestTable表的UniqueCode字段添加一个聚簇索引

    CREATE CLUSTERED INDEX IndexTestTable_index_uniquecode ON IndexTestTable(UniqueCode)

    以上的代码是最简单最直接设置索引的方式,而通常实际应用中,会有多字段联合添加索引的情况,这个就需要你根据实际的应用查询场景,以及在where条件下最常用的查询字段,例如:在 TableX中你最经常查询的条件为:

    SELECT Name,Message 
    FROM TableX 
    WHERE 1=1 
    AND DeptId='003523' 
    AND LimitedCondition='SomeValue' 
    

    这个时候你就可以 添加一个基于 DeptId 和 LimitedCondition 两个字段的非聚簇索引,以便于加速查询速度;

    CREATE NONCLUSTERED INDEX TableX_index_departid_limitedcondition 
    ON TableX(DeptId,LimitedCondition);
    

    简言之,就是需要根据你的实际应用场景,添加有用并且高效的索引;

    展开全文
  • 第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点...

    myisam 和 innodb

    • 第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
    • myisam的主键索引,索引着数据块地址,其他索引也是索引着数据块地址 --》 非聚簇索引
    • innodb的主键索引,索引和数据是一起的(非数据块地址),其他索引直接索引着主键的值(也就是innodb所有的辅助索引都引用主键 作为data域)–》聚簇索引
    • 不管是myisam还是innodb 他们索引用的都是b+tree结构

    覆盖索引

    • A表中有四个字段ID,USER_NAME,PHONE,EMAIL,ADDR,
    • 第一种情况对USER_NAME建立索引
      • select phone from A where user_name=“user”
      • 需要进行回表
    • 第二种情况对user_name 和 phone 建立索引
      • select phone from A where user_name=“user”
      • 这个不需要回表,而是直接在命中索引的时候返回phone的值
    展开全文
  • MySQL中Innodb的聚簇索引和非聚簇索引

    万次阅读 热门讨论 2018-08-29 22:22:15
    数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引(又叫二级索引)两种。Innodb的聚簇索引在同一个B-Tree中保存了索引列和具体的数据,在聚簇索引中,实际的数据保存在叶子页中,中间的节点页保存指向下...
  • 转自:http://pottievil.com/mysql%E8%AF%AD%E5%8F%A5%E8%B0%83%E4%BC%98-%E5%AF%B9%E8%81%9A%E7%B0%87%E7%B4%A2%E5%BC%95%E5%92%8C%E9%9D%9E%E8%81%9A%E7%B0%87%E7%B4%A2%E5%BC%95%E7%9A%84%E8%AE%A4%E8%AF%86/
  • MYSQL索引:对聚簇索引和非聚簇索引的认识

    万次阅读 多人点赞 2016-07-17 22:13:45
    在《数据库原理》一书中是这么解释聚簇索引和非聚簇索引区别的: 聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。 因此,MYSQL中不同的数据存储引擎对聚
  • MySQL聚簇索引和非聚簇索引的理解

    千次阅读 2020-08-21 23:38:35
    关于聚簇索引和非聚簇索引的概念很多同学找了很多教程但是仍然很迷糊。 这里给出一篇翻译,并给出我的配图,希望对大家理解有帮助。 英文原文:...
  • 但是书中又把InnoDB作为聚簇索引的代表、MyISAM作为非聚簇索引的代表,两者进行比较,这就导致了矛盾点,如果将二级索引等价于非聚簇索引,那InnoDB就不能完全代表聚簇索引;但是单从二级索引的存储形式来看,又属于...
  • Mysql聚簇索引和非聚簇索引原理(数据库)

    万次阅读 多人点赞 2016-11-02 15:53:40
    一、‘页’和操作系统的关系 ①为什么要有内存管理? 我们知道,一个进程完成他的功能,需要访问磁盘加载数据到内存然后等待进入cpu运算,因为数据量大小远远大于内存大小。因此提出虚拟内存概念。...
  • mysql聚簇索引详解

    千次阅读 2018-02-26 12:31:10
    聚簇索引不是一种单独的索引类型,而是一种数据...一个表只能有一个聚簇索引聚簇索引如何存放记录如图:聚簇索引的优点: 可以把相关数据保存在一起 数据访问更快(聚集索引将索引和数据保存在同一个b-tree中) ...
  • 索引分为聚簇索引和非聚簇索引。以一本英文课本为例,要找第8课,直接翻书,若先翻到第5课,则往后翻,再翻到第10课,则又往前翻。这本书本身就是一个索引,即“聚簇索引”。如果要找"fire”这个单词,会翻到书...
  • 如果未定义主键,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使用它作为聚簇索引。如果没有这样的列,InnoDB就自己产生一个这样的ID值,它有六个字节,而且是隐藏的,使其作为聚簇...
  • 聚集索引:指索引项的排序方式和表中数据记录排序方式一致的索引 也就是说聚集索引的顺序就是数据的物理存储顺序。它会根据聚集索引键的顺序来存储表中的数据,即对表的数据按索引键的顺序进行排序,然后重新存储到...
  • (1)InnoDB的主键采用聚簇索引存储,使用的是B+Tree作为索引结构,但是叶子节点存储的是索引值和数据本身(注意和MyISAM的不同)。 (2)InnoDB的二级索引不使用聚蔟索引,叶子节点存储的是KEY字段加主键值。因此,...
  • Mysql索引优化详解

    万次阅读 2018-02-08 17:12:14
    MySQL索引的概念  索引是一种特殊的文件... 索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快
  • 在《数据库原理》一书中是这么解释聚簇索引和非聚簇索引区别的: 聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。 因此,MYSQL中不同的数据存储引擎对聚...
  • Mysql-聚簇索引

    千次阅读 2016-12-11 20:35:03
    整体概述 1.innodb的主索引文件上 直接存放该行数据,称为聚簇索引,次索引指向对主键的引用 2.myisam中,主索引和次索引,都指向物理行(磁盘位置) ...非聚簇索引(myisam): 叶节点仍然是索引节点,有指针指向对应的
  • 聚簇索引和覆盖索引

    千次阅读 2018-08-14 16:30:10
    参考:深入浅出MySql和高性能MySql 聚簇索引聚簇索引并不是一...MySql聚簇索引只能将主键作为索引。如果没有主键,则选择唯一的非空索引,如果都没有,则隐式定义主键,但是这样很不好,相邻键值相距会很远。 ...
  • mysql 二级索引

    万次阅读 2013-11-07 10:48:31
    mysql中每个表都有一个聚簇索引(clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(secondary indexes)。 以InnoDB来说,每个InnoDB表具有一个特殊的索引称为聚集索引。如果您的...
1 2 3 4 5 ... 20
收藏数 12,645
精华内容 5,058
关键字:

mysql 非聚簇索引的区别