聚集索引和非聚集索引的区别是什么

 

聚集索引   

 

在创建聚集索引时,将会对表进行复制,对表中的数据进行排序,然后删除原始的表。因此,数据库上必须有足够的空闲空间,以容纳数据复本。默认情况下,表中的数据在创建索引时排序。但是,如果因聚集索引已经存在,且正在使用同一名称和列重新创建,而数据已经排序,则会重建索引,而不是从头创建该索引,以自动跳过排序操作。重建操作会检查行是否在生成索引时进行了排序。如果有任何行排序不正确,即会取消操作,不创建索引。   


 

非聚集索引  

 
非聚集索引与课本中的索引类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。如果在表中未创建聚集索引,则无法保证这些行具有任何特定的顺序。

 

优势与缺点

 

聚集索引:插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入),查询数据比非聚集数据的速度快

 

 

通俗的说法:

 

聚集索引:相当于字典的正文,按照字母A到Z,固定排序,如果要查询赵(Zhao),自然的排在字典后面。字典正文本身就是目录,不需要在去查询其他目录。(只查询设置聚集索引的字段,而不是全行查询)。

 

每个表只有一个聚集索引,因为目录只能按一种方法进行排序。

 

非聚集索引:相当于偏旁部首,先找到部首,在根据这个字的页码去找到这个字。和内容排序查询的区别是需要两步才能找到所需的字。

 

 

创建索引的方法:


         1)企业管理器中
               (1)右击某个表,所有任务---管理索引,打开管理索引,单击“新建”就可以创建索引
               (2)在设计表中进行设计表,管理索引/键
               (3)在关系图中,添加表后右击关系图中的某个表,就有“索引/键”
               (4)通过向导,数据库---创建索引向导
               (5)通过T-SQL语句
         2)能过“索引优化向导”来优化索引的向导,通过它可以决定选择哪些列做为索引列

 

下面的表总结了何时使用聚集索引或非聚集索引:

 

动作描述使用聚集索引使用非聚集索引
列经常被分组排序
返回某范围内的数据不应
一个或极少不同值不应不应
小数目的不同值不应
大数目的不同值不应
频繁更新的列不应
外键列
主键列
频繁修改索引列不应

 

 

参考资料: 聚集索引和非聚集索引的区别有哪些     http://www.studyofnet.com/news/59.html

 

### 聚集索引非聚集索引区别 在MySQL中,**聚集索引(Clustered Index)**决定了数据在磁盘上的物理存储顺序。一个表只能有一个聚集索引,因为数据行本身只能按照一种方式排序存储。通常情况下,聚集索引是主键索引,即表的主键字段会自动创建聚集索引[^1]。例如,在InnoDB存储引擎中,如果未显式定义主键,则MySQL会尝试使用一个唯一且非空的列作为主键;若没有这样的列,则会自动生成一个隐藏的主键来构建聚集索引。 与之相对,**非聚集索引(Non-Clustered Index)**是在聚集索引之外创建的附加索引。它并不直接包含完整的数据记录,而是存储了指向实际数据行的指针或主键值。因此,一个表可以有多个非聚集索引以支持不同的查询需求[^2]。例如,对于用户表`users`,当执行`SELECT * FROM users WHERE username = 'Alice'`时,首先通过非聚集索引`idx_username`找到对应的主键ID,然后通过该主键ID到聚集索引中查找完整数据行,这个过程被称为“回表”操作[^4]。 从查询效率来看,由于聚集索引的数据在物理上有序,范围查询(如使用`BETWEEN`、`>`、`<`等条件)可以更高效地利用磁盘上的顺序数据访问,从而提高性能[^3]。而非聚集索引虽然也提高了检索速度,但在某些情况下需要额外的I/O操作才能获取完整数据行。然而,如果查询所需的字段全部包含在一个非聚集索引中,这种情况下称为**覆盖索引(Covering Index)**,可以直接从索引中获取数据而无需进行回表,这样也可以实现高效的查询[^4]。 综上所述,两者的主要区别如下: | 特性 | 聚集索引 | 非聚集索引 | |--------------|----------------------------------|----------------------------------| | 数据存储 | 数据按索引顺序物理存储 | 数据独立存储,索引仅存储指针或主键 | | 数量 | 每表一个 | 每表多个 | | 查询效率 | 范围查询高效,直接获取数据 | 可能需回表,覆盖索引时高效 | | 典型应用 | 主键、范围查询、排序 | 高频条件查询、覆盖索引优化 | ```sql -- 示例:创建一个具有聚集索引非聚集索引的表 CREATE TABLE users ( id INT PRIMARY KEY, -- 主键索引,默认为聚集索引 username VARCHAR(50), email VARCHAR(50), INDEX idx_username (username) -- 非聚集索引 ) ENGINE=InnoDB; ``` 此外,维护成本也是两者的差异之一。由于聚集索引直接影响数据的物理存储结构,插入新记录或者更新主键值可能会导致页分裂,进而影响性能。而非聚集索引则更容易维护,因为它只涉及索引本身的调整而不改变数据的实际位置。 最后,选择哪种类型的索引取决于具体的应用场景。对于经常需要进行范围扫描或排序的操作,建议使用聚集索引;而对于频繁执行特定条件查询的情况,则可以通过添加适当的非聚集索引来优化查询性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值