mysql (1) 聚集索引和非聚集索引

聚集索引在MySQL中与数据行存储在一起,找到索引即可找到数据;而非聚集索引则索引与数据分开存储,需要二次查找。虽然非聚集索引查询效率稍低,但可以为非主键字段提供快速访问。每个表只有一个聚集索引,通常由主键创建。非聚集索引适用于不同查询场景,提高查询速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在mysql,聚集索引通常就是主键索引,非聚集索引通常就是普通索引,它们有什么区别?

测试表

先建一张表,有id、name和其他列。id建立主键索引,此时就是聚集索引。name建立普通索引,此时就是非聚集索引。

聚集索引 (id)

聚集的意思:在mysql中的索引的key及其数据行,在物理上是聚集存储在一起的。当找到某个索引的key值,也就找到了其行数据。如下图,找到了id 1,也就找到了第一行数据。

非聚集索引 (name)

非聚集的意思:name索引的key和行数据,在物理上没有聚集存储在一起,而是分开存储。如下图。查询name列,查找到a时,其值为主键id 3,而不是行数据。然后再根据3去查聚集索引,才能查到实际数据。这个过程,是mysql内部实现的。很显然,非聚集索引额外查询了一次,性能必然低于聚集索引。那为什么还要建立非聚集索引?

 聚集索引只会有一个

  • 索引必须是要按顺序存储的,这样才能通过二分查找法,来查找索引。就像我们翻书一样,后面的页数一定比前面的页数大,它是有序的,否则你没法查找特定的页数(索引)在哪。
  • 因为有序,所以只可能是一种顺序。如果按id列的值顺序存储,那这个顺序肯定是不符合name列的值顺序的,除非id列和name列的值顺序是完全一样的,这是无法保证的。所以只会有一种顺序,只能保证建立一个聚集索引
  • 如果在name列额外建立聚集索引,即复制一份数据作为索引的value。此时id和name两个聚集索引,每一行数据将存储两份,要同时维护更新,将会无比复杂。
  • mysql默认会将主键索引作为聚集索引,如果没有主键呢?这里不讨论,不建议这样做。
### MySQL聚集索引非聚集索引 #### 定义与特性 在MySQL中,聚集索引非聚集索引有着不同的定义特点: - **聚集索引**是指表中的数据行按其键值的顺序存储。这意味着当创建了一个聚集索引之后,实际的数据行会依据该索引来排列[^1]。由于这种结构,在一张表里只能拥有一个聚集索引。 - 对于**非聚集索引**而言,它并不会改变表内数据的实际存放次序;相反地,它是基于原有数据建立起来的一种额外访问路径。因此同一张表格可以有多个非聚集索引[^4]。 #### 存储方式对比 - 在**聚集索引**的情况下,叶子结点包含了完整的行数据。换句话说,当我们查找某个特定范围内的记录时,可以直接定位到这些记录的位置并读取它们的内容,这使得查询效率非常高。 - 而对于**非聚集索引**来说,它的叶子节点只包含指向真实数据所在位置的信息(即ROWID或其他形式),所以即使找到了匹配项也需要再次回溯至原始表去获取全部字段信息。 #### 插入操作的影响 值得注意的是,因为**聚集索引**下的数据是以物理顺序保存的,所以在向已排序区域插入新纪录的时候可能会涉及到大量的移动工作,从而影响写入性能。相比之下,**非聚集索引**在这方面表现得更好一些,因为它不会干扰原有序列。 #### 查询性能分析 通常情况下,如果应用程序经常执行全表扫描或是频繁检索大量连续记录,则采用**聚集索引**更为合适,能够显著提升读取速度。然而如果是针对单条或多条离散记录的小规模随机存取需求,那么使用**非聚集索引**可能更加有效率[^2]。 #### 使用场景建议 考虑到上述差异,在决定如何应用这两种类型的索引之前应该仔细评估具体的应用环境: - 如果业务逻辑允许的话,优先考虑为主键设置成**聚集索引**,尤其是那些具有自然增长特性的主键字段。 - 当面对多维度复杂条件过滤的需求时,可以通过构建合理的**非聚集索引**组合来加速查询过程。 ```sql -- 创建带有聚集索引的表 (假设id 是 AUTO_INCREMENT 的整数类型) CREATE TABLE example_table ( id INT NOT NULL PRIMARY KEY, name VARCHAR(50), age INT ); -- 添加一个新的非聚集索引给 'name' 列 ALTER TABLE example_table ADD INDEX idx_name(name); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值