主键,唯一索引 聚集索引的关系

本文深入探讨了数据库索引的设计原则及其对查询性能的影响。详细解释了聚集索引与非聚集索引的区别,并讨论了主键与唯一索引的关系。此外,还提供了关于如何选择合适的索引类型和列的实用建议。

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

     为列创建索引实际上就是为列进行排序,以方便查询.建立一个列的索引,就相当与建立一个列的排序。

    主键是唯一的,所以创建了一个主键的同时,也就这个字段创建了一个唯一的索引,

    唯一索引实际上就是要求指定的列中所有的数据必须不同。

    主键一唯一索引的区别:

         1 一个表的主键只能有一个,而唯一索引可以建多个。
         2 主键可以作为其它表的外键。
         3 主键不可为null,唯一索引可以为null。

聚集索引:将表内的数据按照一定的规则进行排列的目录。正因为如此,一个表中的聚焦索引只有一个。对此我们要注意“主键就是聚焦索引”这是极端错误的,是对聚焦索引的一种浪费。(虽然SQLServer默认主键就是聚焦索引)使用聚焦索引的最大好处就是按照查询要求,迅速缩小查询范围,避免进行全表扫描。其次让每个数目都不相同的字段作为聚焦索引也不符合“大数目不同情况下不应建立聚集索引的原则”。

一、索引的作用

1、帮助检索数据;

2、提高联接效率;

3、节省ORDER BY、GROUP BY的时间;

4、保证数据唯一性(仅限于唯一索引)。

 

二、索引的设计

在确定要建立一个索引时,首先我们要确定它是聚集还是非聚集、单列还是多列、唯一还是非唯一、列是升序还是降序、它的存储是如何的,比如:分区、填充因子等。下面逐条来看:

1、聚集索引

(1)首先指出一个误区,主键并不一定是聚集索引,只是在SQL SERVER中,未明确指出的情况下,默认将主键定义为聚集,而ORACLE中则默认是非聚集,因为SQL SERVER中的ROWID未开放使用。

(2)聚集索引适合用于需要进行范围查找的列,因为聚集索引的叶子节点存放的是有序的数据行,查询引擎可根据WHERE中给出的范围,直接定位到两端的叶子节点,将这部分节点页的数据根据链表顺序取出即可;

(3)聚集索引尽量建立在值不会发生变更的列上,否则会带来非聚集索引的维护;

(4)尽量在建立非聚集索引之前建立聚集索引,否则会导致表上所有非聚集索引的重建;

(5)聚集索引应该避免建立在数值单调的列上,否则可能会造成IO的竞争,以及B树的不平衡,从而导致数据库系统频繁的维护B树的平衡性。聚集索引的列值最好能够在表中均匀分布。

3、唯一索引

(1)再指出一个误区,聚集索引并不一定是唯一索引,由于SQL SERVER将主键默认定义为聚集索引,事实上,索引是否唯一与是否聚集是不相关的,聚集索引可以是唯一索引,也可以是非唯一索引;

(2)将索引设置为唯一,对于等值查找是很有利的,当查到第一条符合条件的纪录时即可停止查找,返回数据,而非唯一索引则要继续查找,同样,由于需要保证唯一性,每一行数据的插入都会去检查重复性;

 

更详细的信息参见漫漫技术人生路的博客http://www.cnblogs.com/javaca88/.

 

### 主键索引唯一索引的区别 主键索引唯一索引在 MySQL 数据库中均起到确保数据唯一性的目的,但在具体实现方式、特性以及使用场景上存在显著差异。 #### 1. **定义** - **主键索引** 主键索引是一种特殊的唯一索引,用于唯一标识表中的每一行记录。它要求字段值不仅唯一,而且不能为空(NOT NULL)。每个表最多只能有一个主键索引[^2]。 - **唯一索引** 唯一索引同样要求字段值唯一,但它允许存在空值(NULL),并且可以在同一张表中创建多个唯一索引。 --- #### 2. **唯一性** - 主键索引严格要求每行数据都有一个唯一的非空值作为标识符。 - 唯一索引允许多个 NULL 值的存在,只要非 NULL 的值保持唯一即可。 --- #### 3. **数量限制** - 每个表只能拥有一个主键索引[^2]。 - 同一张表可以包含多个唯一索引。 --- #### 4. **自动增长** - 主键索引常与 `AUTO_INCREMENT` 属性配合使用,以自动生成递增的唯一值[^2]。 - 唯一索引并不依赖于自动增长机制,只需满足唯一性约束即可[^2]。 --- #### 5. **聚集索引 vs 非聚集索引** - 主键索引通常是聚集索引,意味着数据的实际存储顺序与主键的逻辑顺序一致,这有助于提升基于主键查询的性能[^2]。 - 唯一索引一般是非聚集索引,其物理存储顺序与索引的创建顺序无直接关联。 --- #### 6. **外键关联** - 主键索引经常被用作其他表的外键目标,以此维护不同表之间的一致性和完整性。 - 尽管唯一索引也可以提供唯一性保障,但由于其地位不及主键重要,在实际应用中外键较少指向唯一索引[^2]。 --- #### 7. **适用场景** - **主键索引**适合用来唯一标识表内的每一条记录,并且需要强制保证该字段既不可重复也不可为空的情况。例如用户的 ID 字段就是一个典型例子[^2]。 - **唯一索引**更适合那些只需要确保某列或者某些列组合下的值不重复,但又允许部分条目缺失(即为 NULL)的情形。比如电子邮件地址这样的字段就可以考虑设置成唯一索引以便防止重复注册的同时还保留处理未填写邮箱的可能性[^2]。 --- ```sql -- 创建带有主键索引表格示例 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) UNIQUE ); -- 插入测试数据 INSERT INTO users (username, email) VALUES ('john_doe', 'john@example.com'); ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值