主键和索引

一、主键

1、主键可以对一张表起到唯一标识作用,其值不能为NULL,也不能重复;

2、一张表只能定义一个主键;

3、表建立主键时,在列上自动建立一个唯一性索引;

4、主键可以是列级约束,也可以是表级约束。

二、索引

索引是一种可选的与表相关的数据库对象,用于提高数据的查询效率。索引是建立在表列上的数据库对象,但无论其物理结构还是逻辑结构都不依赖于表。索引之所以能够提高查询效率,是因为在索引结构中保存了索引值及相应记录的物理地址,即ROWID,并且按照索引值进行排序 (快速查找、二分查找等排序算法)。

1、唯一索引 与 非唯一索引

2、平衡树索引 与 位图索引,这是根据索引的组织不同而分

3、单列索引 与 复合索引

4、函数索引


### 数据库中主键索引的区别 #### 定义上的差异 主键是一种用于确保表中每一行数据唯一的约束机制,其核心作用在于标识每一条记录的唯一性[^2]。主键不允许存在重复值或空值(NULL),并且在一个表中只能定义一个主键。 相比之下,索引则是为了优化查询性能而设计的一种数据结构。通过创建索引,可以加速对数据库表的检索操作,减少全表扫描的可能性。需要注意的是,索引并不强制要求唯一性,除了唯一索引之外,普通的索引允许存储相同的值。 --- #### 存储结构的不同 主键通常会隐式地触发一种特殊的索引——聚簇索引(Clustered Index)。在这种情况下,主键的叶子节点实际上存储了整行数据的全部内容[^3]。这意味着当按照主键进行查询时,可以直接定位到目标数据所在的物理位置,无需额外的操作。 而对于非主键字段建立的索引(即二级索引或辅助索引),其叶子节点仅保存指向主键的引用值,而不是完整的行数据[^1]。因此,在使用非主键索引进行查询时,可能需要经历两次查找的过程:第一次查找到主键值,第二次再利用主键去实际获取所需的数据,这一过程被称作“回表”。 --- #### 唯一性数量限制 主键本质上是一个具有唯一性的约束条件,它不仅限定了字段值不可重复,还规定了整个表内必须保持全局唯一性[^2]。此外,一张表最多只能拥有单一主键。 然而,关于索引的数量并没有类似的严格限制。理论上可以在同一张表上针对不同或者组合构建多个普通索引、唯一索引甚至是全文索引等多种类型的索引[^2]。不过值得注意的是,过多的索引可能会带来写入性能下降等问题,因为每次更新数据都需要同步维护相应的索引信息。 --- #### 创建方式对比 在SQL语法层面,声明主键的同时也会自动为其生成默认的聚簇索引(除非另行指定为非聚集形式)[^4]。例如: ```sql CREATE TABLE example ( id INT PRIMARY KEY, name VARCHAR(50) ); ``` 与此同时,单独添加其他类型索引则需显式调用`CREATE INDEX`命令完成设置。比如下面的例子展示了如何基于某个非主键列新建一个常规索引: ```sql CREATE INDEX idx_name ON example(name); ``` --- #### 查询效率的影响 由于主键关联着底层高效的聚簇索引实现方案,所以在执行精确匹配条件下按主键访问往往能够达到最优的速度表现。相反,尽管非主键索引有助于改善某些场景下的读取效能,但由于可能存在前述提到过的“回表”现象,总体耗时未必总是优于前者。 另外值得一提的是,B+树作为当前主流关系型数据库普遍采用的基础算法模型之一,在处理范围查询方面展现出显著优势,这正是为何大多数系统倾向于选用此类技术框架代替简单哈希表的原因所在。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值