聚簇索引 & 非聚簇索引

  建立索引的目的是加快对表中记录的查找或排序。付出的代价:

1. 增加了数据库的存储空间

2. 在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。

一。索引分类

  索引分为聚簇索引和非聚簇索引两种。

  每个表只能有一个聚簇索引,因为一个表中的记录只能以一种物理顺序存放。但是,一个表可以有不止一个非聚簇索引。实际上,对每个表你最多可以建立

249个非聚簇索引。非聚簇索引需要大量的硬盘空间和内存。另外,虽然非聚簇索引可以提高从表中取数据的速度,它也会降低向表中插入和更新数据的速度。

每当你改变了一个建立了非聚簇索引的表中的数据时,必须同时更新索引。因此你对一个表建立非聚簇索引时要慎重考虑。如果你预计一个表需要频繁地更新数

据,那么不要对它建立太多非聚簇索引。另外,如果硬盘和内存空间有限,也应该限制使用非聚簇索引的数量。

二。区别

1. 聚簇索引的叶节点就是数据节点,而非聚簇索引的页节点仍然是索引检点,并保留一个链接指向对应数据块。

2. 聚簇索引主键的插入速度要比非聚簇索引主键的插入速度慢很多。

3. 相比之下,聚簇索引适合排序,非聚簇索引不适合用在排序的场合。因为聚簇索引本身已经是按照物理顺序放置的,排序很快。非聚簇索引则没有按序存放,

需要额外消耗资源来排序。

4. 当你需要取出一定范围内的数据时,用聚簇索引也比用非聚簇索引好。

三。建立聚簇索引的思想

1、大多数表都应该有聚簇索引或使用分区来降低对表尾页的竞争,在一个高事务的环境中,对最后一页的封锁严重影响系统的吞吐量。

2、在聚簇索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查(between、<、<=、>、>=)或使用group by或

order by的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行保证物理上毗连在一起而不必进一步搜索,避免了大范围扫描。

3、在一个频繁发生插入操作的表上建立聚簇索引时,不要建在具有单调上升值的列上,否则会经常引起封锁冲突。

4、在聚簇索引中不要包含经常修改的列,因为码值修改后,数据行必须移动到新的位置。

5、选择聚簇索引应基于where子句和连接操作的类型。

四。聚簇索引的侯选列

1、主键列,该列在where子句中使用并且插入是随机的。

2、按范围存取的列,如pri_order > 100 and pri_order < 200。

3、在group by或order by中使用的列。

4、不经常修改的列。

5、在连接操作中使用的列。

五。MySQL 的聚簇索引

  1. InnoDB使用B-Tree来实现聚簇索引,并把索引和数据存放在同一结构中。

  2. 只有叶子节点才包括了数据行的值,非叶子节点只存了索引字段。

  3. InnoDB只能按照主键做聚簇。如果表中没有定义主键,InnoDB会选择一个非空且有唯一性约束的索引来做聚簇,如果没有这样的索引,则会定义一个

不可见的主键,并以这个主键来聚簇。

  4. InnoDB clusters records together only within a page. Pages with adjacent key values may be distant from each other.

  InnoDB的聚簇是页面级别的,即聚簇索引值相邻的行会被存入同一个页面,当这个页面存满时,接下来的相邻行会被存入另外一个页面,而这两个页面可

能会离的很远。如图中的布局所示,索引值为1~10的行被存在第一个页面,11~20的行被存在另外一个页面,数据被聚簇在单个页面内,而页面1和页面2的磁盘

位置却可能离的很远。

聚簇索引 & 非聚簇索引

时间: 2024-10-10 10:10:30

聚簇索引 & 非聚簇索引的相关文章

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

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

聚簇索引与非聚簇索引

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

Clustered Index &amp; Non Clustered Index(聚簇索引和非聚簇索引)

每个表只能有一个聚簇索引,而能有200多个非聚簇索引. 在物理分配上, 每个表的数据都是分配在页上,一个页大概有8k左右,假设一条数据占1000字节的话,那么8000条数据占8000*1k/8k = 1000页面,这些数据存在于数据块中. 如果对这些数据中的某一10字节的字段做聚簇索引的话,8000 * 0.01k /8k = 10 页面,那么10页面作为存储这些索引而存在.并存放于索引块 如果对这些数据中的某一10字节的字段做非聚簇索引的话,2 * 8000 * 0.01k /8k = 20 

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

通常情况下,建立索引是加快查询速度的有效手段.但索引不是万能的,靠索引并不能实现对所有数据的快速存取.事实上,如果索引策略和数据检索需求严重不符的话,建立索引反而会降低查询性能.因此在实际使用当中,应该充分考虑到索引的开销,包括磁盘空间的开销及处理开销(如资源竞争和加锁).例如,如果数据频繁的更新或删加,就不宜建立索引. 本文简要讨论一下聚簇索引的特点及其与非聚簇索引的区别. 建立索引: 在SQL语言中,建立聚簇索引使用CREATE INDEX语句,格式为:CREATE CLUSTER INDE

【转】聚簇索引与非聚簇索引的区别

通常情况下,建立索引是加快查询速度的有效手段.但索引不是万能的,靠索引并不能实现对所有数据的快速存取.事实上,如果索引策略和数据检索需求严重不符的话,建立索引反而会降低查询性能.因此在实际使用当中,应该充分考虑到索引的开销,包括磁盘空间的开销及处理开销(如资源竞争和加锁).例如,如果数据频繁的更新或删加,就不宜建立索引. 本文简要讨论一下聚簇索引的特点及其与非聚簇索引的区别. 建立索引: 在SQL语言中,建立聚簇索引使用CREATE INDEX语句,格式为:CREATE CLUSTER INDE

聚簇索引和非聚簇索引

聚簇索引:表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致.对于聚簇索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页.在一张表上最多只能创建一个聚簇索引,因为真实数据的物理顺序只能有一种,查找到索引就是查找到数据,所以速度快,innodb就是聚簇索引表,即使没有主键,也会有隐藏的rowid记录. 非聚簇索引.表数据存储顺序与索引顺序无关.对于非聚簇索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致,访问索引实际上就是访问数据指

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使用的是非聚簇索引 原始数据 存储方式 按照列值和行号来组织索引的 叶子节点中保存的实际上是指向存放数据块的

MySQL非聚簇索引&&二级索引&&辅助索引

MySQL非聚簇索引&&二级索引&&辅助索引 mysql中每个表都有一个聚簇索引(clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(secondary indexes). 以InnoDB来说,每个InnoDB表具有一个特殊的索引称为聚集索引.如果您的表上定义有主键,该主键索引是聚集索引.如果你不定义为您的表的主键时,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使用它作为聚集索引