还是索引

SQL聚集索引与非聚集索引的区别解析
 

你能说出SQL聚集索引和非聚集索引的区别吗?

字体:        | 上一篇 下一篇 | 打印  | 我要投稿 

  其实上面的我们需要搞清楚以下几个问题:

  第一:聚集索引的约束是唯一性,是否要求字段也是唯一的呢?

  分析:如果认为是的朋友,可能是受系统默认设置的影响,一般我们指定一个表的主键,如果这个表之前没有聚集索引,同时建立主键时候没有强制指定使用非聚集索引,SQL会默认在此字段上创建一个聚集索引,而主键都是唯一的,所以理所当然的认为创建聚集索引的字段也需要唯一。

  结论:聚集索引可以创建在任何一列你想创建的字段上,这是从理论上讲,实际情况并不能随便指定,否则在性能上会是恶梦。

  第二:为什么聚集索引可以创建在任何一列上,如果此表没有主键约束,即有可能存在重复行数据呢?

  粗一看,这还真是和聚集索引的约束相背,但实际情况真可以创建聚集索引。

  分析其原因是:如果未使用 UNIQUE 属性创建聚集索引,数据库引擎将向表自动添加一个四字节 uniqueifier 列。必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。

  第三:是不是聚集索引就一定要比非聚集索引性能优呢?

  如果想查询学分在60-90之间的学生的学分以及姓名,在学分上创建聚集索引是否是最优的呢?

  答:否。既然只输出两列,我们可以在学分以及学生姓名上创建联合非聚集索引,此时的索引就形成了覆盖索引,即索引所存储的内容就是最终输出的数据,这种索引在比以学分为聚集索引做查询性能更好。

  第四:在数据库中通过什么描述聚集索引与非聚集索引的?

  索引是通过二叉树的形式进行描述的,我们可以这样区分聚集与非聚集索引的区别:聚集索引的叶节点就是最终的数据节点,而非聚集索引的叶节仍然是索引节点,但它有一个指向最终数据的指针。

  第五:在主键是创建聚集索引的表在数据插入上为什么比主键上创建非聚集索引表速度要慢?

  有了上面第四点的认识,我们分析这个问题就有把握了,在有主键的表中插入数据行,由于有主键唯一性的约束,所以需要保证插入的数据没有重复。我们来比较下主键为聚集索引和非聚集索引的查找情况:聚集索引由于索引叶节点就是数据页,所以如果想检查主键的唯一性,需要遍历所有数据节点才行,但非聚集索引不同,由于非聚集索引上已经包含了主键值,所以查找主键唯一性,只需要遍历所有的索引页就行,这比遍历所有数据行减少了不少IO消耗。这就是为什么主键上创建非聚集索引比主键上创建聚集索引在插入数据时要快的真正原因。

  好了,讲这这些,不知道大家是否真的了解SQL的聚焦索引,我也是数据库新手(从使用时间上来讲也不算新了,哈哈),不专业,有什么不对的地方,希望大家批评指正,下篇我会分析一些数据库访问索引的情况,有图的情况下,也许看的更加明白。

### 非空约束与索引的概念区分 在 Oracle 数据库中,**非空(NOT NULL)** 是一种**约束(Constraint)**,用于确保某列中不包含空值(NULL)。它并不等同于索引,而是属于数据库完整性约束的一种机制。约束用于维护数据的正确性和一致性,而非空约束特别用于防止插入或更新 NULL 值到指定列中[^3]。 相比之下,**索引(Index)** 是一种数据库对象,用于加快数据的检索速度。索引可以是唯一性的(UNIQUE),也可以是非唯一的。唯一索引确保索引列中的值在表中是唯一的,但唯一索引允许存在多个 NULL 值(在 Oracle 中,多个 NULL 值不被认为重复)[^2]。 ### 非空约束的作用与实现 非空约束通过在列定义中添加 `NOT NULL` 来实现。例如: ```sql CREATE TABLE employees ( employee_id NUMBER NOT NULL, name VARCHAR2(100) ); ``` 在此表定义中,`employee_id` 列不允许为 NULL。若尝试插入或更新该列为 NULL 值,数据库将抛出错误。非空约束通常与其他约束(如主键或唯一约束)结合使用,以确保数据完整性[^3]。 ### 索引的作用与实现 索引则通过 `CREATE INDEX` 语句创建。例如,创建一个唯一索引: ```sql CREATE UNIQUE INDEX idx_employee_id ON employees(employee_id); ``` 该语句将在 `employee_id` 列上创建一个唯一索引,确保该列值的唯一性。若列中存在多个 NULL 值,该索引仍然允许插入,因为 Oracle 不将多个 NULL 值视为重复。 若希望确保索引列中不存在 NULL 值,则必须同时定义该列为 `NOT NULL`。例如: ```sql CREATE TABLE userinfo ( userid NUMBER NOT NULL, username VARCHAR2(50) ); CREATE UNIQUE INDEX userid_unique ON userinfo(userid); ``` 此方式确保 `userid` 列中不存在 NULL 值,并且值是唯一的[^2]。 ### 主键约束的特殊性 Oracle 中的主键约束(PRIMARY KEY)具有特殊性,它同时包含非空约束和唯一索引的功能。定义主键时,Oracle 自动为该列添加 `NOT NULL` 约束,并创建一个唯一索引。例如: ```sql CREATE TABLE orders ( order_id NUMBER PRIMARY KEY, customer_id NUMBER ); ``` 该语句自动确保 `order_id` 列不为空,并且其值在表中唯一[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值