数据库小技能:约束、索引

141 阅读4分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

引言

约束条件用于保证数据的完整性。 主要有主键约束(primary key)/非空约束(not null)、唯一约束(unique) 检查约束(check)和外键约束(foreign key)。

I 约束

1.1 主键约束(primary key)

主键约束包含了非空和唯一

create table 表名(字段名 字段类型(长度) 约束条件);

创建自定义名称约束

create table 表名(字段名 字段类型(长度),constraint 约束名 约束类型(字段名));

注:可以通过user_constraints数据字典来查询约束。

联合主键

constraint pk_t_emp primary key (字段1,字段2);

1.2 非空约束(not null)

1.3 检查约束(check)

create table t_test(id number(10);sex char(2); constraint test_sex check (sex in('男',‘女’)));--可以通过在字段后面加 default 值,来设置默认值;在使用默认值时使用default关键字。

元组上的约束的定义:元组级别的限制可以设置不同属性之间取值的相互约束条件

check(ssex='女' or sname NOT like 'MS.%');--当学生性别为男时,其名字不能以MS.开头。

1.4 外键约束

foreign key 字段名 references 表名(字段名)

外键字段可以为空,或者引用自依赖的父项。

设置级联

  1. 赋予空值
foreign key(外键字段) references 表名(字段) on delete set null
  1. 级联删除
foreign key(外键字段) references 表名(字段) on delete cascade;

1.5 DDL操作约束

alter table 表名 drop contraints 约束名称;

alter table 表名 add  contraints 约束名称 约束类型(字段);

alter table 表名 modify (字段 字段类型 要添加的约束);

II 索引

快速的查找定位到某条记录(底层采用rowid来实现),没有索引查找时,将采用全表扫描(full table scan)。

索引的原理:对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表中就可以利用二分查找快速找到要查找的行的地址,再根据地址直接取行数据。

  1. 查找索引可以使用user_indexes数据字典。

  2. 数据库默认为表中的主键和唯一键建立索引。

2.1 自定义索引

create index 索引名 on 表名(字段名);
  • 不应该应用索引的情况:
  1. 经常进行更新操作的字段

  2. 表小,查询结果集大

  3. 不常用的字段

  • 应用索引的情况:
  1. 经常用来查询的字段

  2. 当表的数据量很大且查询的结果集较小

  3. 当前字段值很多为空的字段

  4. 经常用来作为联合查询的字段

  5. 外键字段

2.2 索引操作法则

  1. 避免对索引字段进行计算操作

  2. 避免在索引字段上使用not、<、>、和!=

  3. 避免在索引列上使用is nullis not null

  4. 避免在索引列上出现数据类型转换

  5. 避免在索引字段上使用函数

  6. 避免在建立索引的列中使用空值.

2.3 对索引的认识

索引的结构、对dml的影响、对查询的影响和为什么提高查询性能?

  1. 索引有b-tree和cluster等类型。oracle使用了一个复杂的自平衡b-tree结构;

  2. 通常来说在表上建立适当的索引,在查询时会改进查询性能。

  3. 但在进行插入、修改和删除是,同时会进行索引的修改,在性能上有一定的影响。索引通常能够提高select、update和delete的性能,但会降低insert的速度。

  4. 有索引且在查询条件使用索引时,数据库会先读取索引,再根据索引内容和查询条件来查询出rowid,最后根据rowid取出需要的数据。由于索引内容通常比全表内容要少很多,因此通过先读索引能够减少I/O,提高查询性能。

III 数据字典

存储描述对象(表,序列、视图、触发器、过程、函数等)信息的表或视图称为数据字典。

  • user_XXX 表示当前用户的相关信息的数据字典

user_tables/user_constraints/user_indexes/user_sequences/user_views/user_objects

  • user_all_XXX 当前用户所能访问的对象的数据字典
  • dba_xxx 当前数据库下得所有对象的数据字典