数据库的聚簇索引和非聚簇索引

华为面试提到了数据库(索引)的数据结构,当时懵逼了,于是调查一下。

首先要讲一下索引的概念;所以其实是独立于数据而存储的;因为索引的用途是查询,所以存储的数据结构是B树(面试之后,我和面试官沟通了一下,数据库存储的数据结构是什么,结果被鄙视了);索引/ 数据的存储一般是以页为单位的;

那么为甚采用B树,而不是平衡二叉树之类的二叉树?因为B树可以有多个孩子,可以控制深度;二叉树则是一个节点只能有两个叶子(孩子)所以深度比较深,如果数据量很大,将会造成IO压力。

聚簇索引和非的本质差别在于叶子节点,首先要明白聚簇索引的意义是按照物理排序来进行索引;因为数据的物理存储只能是一种方式,所以一张表只能有一个聚簇索引;他的数据结构的实现就是树的叶子节点就是是数据本身;这样索引页和数据页就有了耦合;

非聚簇则是有些"逻辑"排序的意味,和数据的物理排序没有关系;那么就需要索引表和数据表进行解耦,这个结构就是叶子节点,叶子节点不再直接指向数据,而是保存了数据的存储指针;

那么为什么讲索引查询是要比数据便利快呢?其实也并不是一定快;如果查询的结果集是比较小的,那么通过索引来查询是比较快的;因为通过索引数据页(可能是多个页)获取数据的位置集合,然后在根据集合来找到对应的数据位置,如果是聚簇索引那么直接就可以访问到数据;但是如果是selec * from tbl这种sql,其实查索引反而要慢;因为这意味着你既要遍历索引页,还要遍历数据页(因为即使你获得了索引位置,但是是几乎所有数据的页内位置,其实就是遍历);所以一般的数据库系统都会自动进行统计数据信息;根据sql语句进行优化查询路径;如果是大量数据的查询直接遍历数据页;但是如果是少量数据,则首先走索引页,然后再走数据页。

那么时候用聚簇索引?对于查询频繁的表,使用聚簇索引,因为可以直接关联到数据,比非聚簇索引少了一层关联关系;如果是增删频发,则要考虑使用非聚簇索引,因为插入一个主键前是要遍历数据的,因为非聚簇索引的叶子节点内容就是索引列的数据,所以只需要遍历索引页即可判断是否有重复;否则聚簇索引每次插入一条记录其实都是需要遍历数据页才能够判断是否重复。

数据因为是以二进制的形式存储,大家都是紧挨着,即使有专用的字段描述一条记录长度,也是要计算,所以遍历这个动作其实就是真的遍历,这个数据文件(页)的走,即使跳过也需要计数,这个过程还是比较耗费时间的。所以很多时候,查索引还是要比查数据文件快;因为遍历索引的页的量一定比遍历数据页要小,获取位置之后可以进行访问;是否走索引的关键就在这里,获取位置之后,如果位置也是海量的,那么走索引的性能提升其实就不是很明显了

参考:

https://www.jb51.net/article/29693.htm

原文地址:https://www.cnblogs.com/xiashiwendao/p/9278753.html

时间: 2024-11-02 22:57:55

数据库的聚簇索引和非聚簇索引的相关文章

聚簇索引与非聚簇索引

索引是一种数据结构,用来快速访问数据库表格或者视图中的数据. 索引的目的是加快对表中数据记录的查找或排序. 索引的代价一是增加了数据库的存储空间,二是在插入和修改时要花费更多的时间. 索引有两中形式,聚簇索引和非聚簇索引 聚簇索引也叫聚集索引,是一种对磁盘上数据重新组织以按指定 的一个或多个列的值排列.每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页. 非聚簇索引的索引顺序与数据物理顺序无关. 聚簇索引和非聚簇的区别: 1.聚簇索引的叶节点

【Mysql优化】聚簇索引与非聚簇索引概念

首先明白两句话: innodb的次索引指向对主键的引用  (聚簇索引) myisam的次索引和主索引   都指向物理行 (非聚簇索引) 聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法.特点是存储数据的顺序和索引顺序一致.一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引(理由:数据一旦存储,顺序只能有一种). 在<数据库原理>一书中是这么解释聚簇索引和非聚簇索引的区别的: 聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对

MySQL 聚簇索引和非聚簇索引的认识

聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法.特点是存储数据的顺序和索引顺序一致.一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引. 在<数据库原理>一书中是这么解释聚簇索引和非聚簇索引的区别的:聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针. 因此,MYSQL中不同的数据存储引擎对聚簇索引的支持不同就很好解释了.下面,我们可以看一下MYSQL中MYISAM和INNODB两种引擎的索引结构 myisa

通俗易懂 索引、单列索引、复合索引、主键、唯一索引、聚簇索引、非聚簇索引、唯一聚簇索引 的区别与联系

索引 数据库只做两件事情:存储数据.检索数据.而索引是在你存储的数据之外,额外保存一些路标(一般是B+树),以减少检索数据的时间.所以索引是主数据衍生的附加结构. 一张表可以建立任意多个索引,每个索引可以是任意多个字段的组合.索引可能会提高查询速度(如果查询时使用了索引),但一定会减慢写入速度,因为每次写入时都需要更新索引,所以索引只应该加在经常需要搜索的列上,不要加在写多读少的列上. 单列索引 与 复合索引 只包含一个字段的索引叫做单列索引,包含两个或以上字段的索引叫做复合索引(或组合索引).

MySQL中Innodb的聚簇索引和非聚簇索引

聚簇索引 数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引(又叫二级索引)两种.Innodb的聚簇索引在同一个B-Tree中保存了索引列和具体的数据,在聚簇索引中,实际的数据保存在叶子页中,中间的节点页保存指向下一层页面的指针.“聚簇”的意思是数据行被按照一定顺序一个个紧密地排列在一起存储.一个表只能有一个聚簇索引,因为在一个表中数据的存放方式只有一种. 一般来说,将通过主键作为聚簇索引的索引列,也就是通过主键聚集数据.下图展示了Innodb中聚簇索引的结构(图片来自<高性能MySQL

mysql索引总结(3)-MySQL聚簇索引和非聚簇索引

非聚簇索引 索引节点的叶子页面就好比一片叶子.叶子头便是索引键值. 先创建一张表: CREATE TABLE `user` ( `id` INT NOT NULL , `name` VARCHAR NOT NULL , `class` VARCHAR NOT NULL); 对于MYISAM引擎,如果创建 id 和 name 为索引.对于下面查询: select * from user where id = 1 会利用索引,先在索引树中快速检索到 id,但是要想取到id对应行数据,必须找到改行数据

mysql索引总结(2)-MySQL聚簇索引和非聚簇索引

聚簇索引就是对磁盘上的实际数据重新组织以按照特定的一个或者多个列的值排序的算法 特点是存储数据的顺序和索引顺序一致 一般情况下主键会默认生成聚簇索引 且一张表有且只有一个聚簇索引 聚簇索引和非聚簇索引的区别是: 聚簇索引的叶子节点就是数据节点 而非聚簇索引的叶子节点仍然是索引文件 只是这个索引文件中包含指向对应数据块的指针 MySQL中不同的数据存储引擎对聚簇索引有不同的支持 MyISAM使用的是非聚簇索引 原始数据 存储方式 按照列值和行号来组织索引的 叶子节点中保存的实际上是指向存放数据块的

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

一.聚簇索引和非聚簇索引 1.聚簇索引和非聚簇索引: 我拿查字典做一个比喻,字典的页面就好比是物理排列顺序,物理排列顺序是固定的,查询的方式就好比是索引,区别是聚簇索引就好比是拼音查询,每一个字母查询出来的页面顺序是跟你字母的顺序一致的,a字母查询出来的页面一定是在c字母查询出来的页面前面,而非聚簇索引就好比是笔画查询,笔画少的查出来的页面不一定在笔画多的查出来的页面前面,也就是你通过笔画查询的顺序和页面的顺序并不是一致的. 再举一例:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的索引顺

MySQL聚簇索引和非聚簇索引的对比

首先要清楚:聚簇索引并不是一种单独的索引类型,而是一种存储数据的方式. 聚簇索引在实际中用的很多,Innodb就是聚簇索引,Myisam 是非聚簇索引. 在之前我想插入一段关于innodb和myisam的数据文件的对比: innodb一张表在硬盘上通过两个文件存储:tablename.frm,tablename.ibd,而myisam有三个文件:tablename.frm,tablename.myi,tablename.myd. frm是表结构文件,myi是索引文件,myd是数据文件,ibd是数