ORACLE里那些索引和约束到底是怎么回事,弄明白才好用数据库嘛
- 问答
- 2026-01-01 22:05:56
- 3
(引用来源:Oracle官方文档概念指南、Oracle数据库管理基础教程)
首先得说,在ORACLE数据库里,索引和约束是两样东西,但它们经常一起出现,容易搞混,咱们分开说,先说索引,因为它更偏向于一种“性能工具”。
索引是怎么回事呢?你可以把它想象成一本书最后面的“索引”部分,比如一本很厚的百科全书,你想找关于“光合作用”的内容,如果一页一页翻,那太慢了,但如果你先翻到书后面的索引,按拼音找到“光”字,后面写着“光合作用:第150页,第320页”,你就能直接翻到那两页,速度飞快,数据库里的索引干的就是这个事儿。
(引用来源:Oracle数据库性能调优指南) ORACLE里的索引,就是在表的一列或者几列上,另外创建的一个小小的、排好序的数据结构,这个结构能帮助数据库引擎不用扫描整个表(这叫全表扫描,就像一页一页翻书),而是快速定位到含有你查找数据的那些行,最常见的索引叫B树索引,它像一棵倒过来的树,有根、有枝、有叶,能高效地进行等值查找(比如where id = 123)和范围查找(比如where salary > 5000),还有一种常用的叫位图索引,适合用在像“性别”、“状态”这种值种类很少的列上。
但索引不是白建的,它有代价,就像那本书,后面的索引本身也占页数,数据库里的索引会占用额外的存储空间,更重要的是,当你往表里增、删、改数据时,数据库不但要动表本身,还得去更新所有相关的索引,以保证索引和表数据一致,这会拖慢数据更新的速度,索引不是越多越好,通常只在经常用于查询条件的列上建索引。
然后咱们说约束,约束和性能关系不大,它管的是“规矩”,是数据正确性的保镖,它的目标是保证表里的数据必须符合你定的规则,不然就不让存进去,ORACLE里主要有这么几种约束:
(引用来源:Oracle数据库SQL语言参考)
- 主键约束:这是最重要的约束,它规定这一列(或几列组合)的值必须唯一,而且不能是空值,一张表只能有一个主键,比如员工表,你肯定希望每个员工有一个独一无二的工号,这个工号列就应该设为主键,数据库会自动为主键列创建一个唯一索引来帮忙实现唯一性检查。
- 唯一约束:它规定一列(或几列组合)的值必须唯一,但允许有空值(不过空值也只能有一个,因为多个空值也被视为“重复”),比如员工邮箱列,你可以设唯一约束,保证邮箱不重复,但允许有人没邮箱(空值),数据库也会为唯一约束自动创建唯一索引。
- 外键约束:这个约束用来建立两张表之间的“父子”关系,比如你有部门表(主键是部门编号)和员工表,员工表里有个“部门编号”列,你可以给它加上外键约束,指向部门表的主键,这样,数据库就会检查:你往员工表里插入一个员工时,他所属的部门编号必须已经在部门表里存在了,这能防止出现“某个员工属于一个不存在的部门”这种荒唐事,同样,如果你想删除部门表里的某个部门,如果员工表里还有员工属于这个部门,数据库也会阻止你删除(除非你设置了级联删除)。
- 检查约束:你可以自己定义一个条件,数据必须满足这个条件才能入库,比如给“年龄”列加一个检查约束“年龄 >= 18”,那么试图插入一个年龄16岁的记录就会失败,给“性别”列加检查约束“性别 IN (‘男‘, ’女’)”,就能防止存入其他乱七八糟的值。
- 非空约束:最简单,就是规定这一列的值不能是空值。
现在你大概看出来了,索引和约束是怎么搅和在一起的,很多时候,为了维护约束(尤其是主键和唯一约束),ORACLE会自动创建索引,这就是它们联系紧密的原因,但它们的本质目的不同:索引是为了查得快,约束是为了数据对。
(引用来源:Oracle数据库管理员实战手册) 在实际用数据库的时候,你得这么想:
- 设计表结构时,先想好约束:哪个是主键?哪些列要唯一?表之间有什么关系?哪些列不能为空?先把数据的“规矩”定死,这是保证数据质量的基础。
- 等数据跑起来后,观察哪些查询慢,然后分析慢的原因,是不是因为经常查询的列上没有索引?如果是,就考虑创建合适的索引来提速,同时要权衡,这个索引带来的查询性能提升,是否值得付出更新数据时变慢的代价。
约束是数据的“交通规则”,保证数据不乱套;索引是数据的“高速公路”,让查询能飞起来,你把规则定好了,路修对了,数据库这辆车才能既跑得快又不出事故,光修路不定规矩,数据会乱;光定规矩不修路,查询会慢,两者结合,才能用好数据库。

本文由酒紫萱于2026-01-01发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/72700.html
