索引、键、约束

聚簇索引和非聚簇索引详细介绍http://blog.csdn.net/dlodj/article/details/7017331

索引是对数据库表的一列或多列的一种排序结构,是一种物理结构,会占用额外的储存空间。相当于表中数据值的目录。它是指向表中物理标识这些值的数据页的逻辑指针清单。

索引的优缺点

优点:

(1)大大加快数据的检索速度;   

(2)创建唯一性索引,保证数据库表中每一行数据的唯一性;   

(3)加速表和表之间的连接;   

(4)在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

缺点:

(1)索引需要占物理空间。   

(2)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

(3)创建和维护索引也需要消耗时间,这种时间随着数据量的增加而增加

 

建立索引时的注意事项:

(1)   考虑已在表上创建的索引数量。最好避免在单个表上有很多索引

(2)   检查已在表上创建的索引的定义。最好避免包含共享列的重叠索引

(3)   检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。比如如果有1000w记录,某字段为性别,只有男,女。也就是说一半的记录都是重复的,这样就要考虑是否还有必要建立索引了。

 

以下情况,应该在这些列上创建索引:

(1) 在经常需要搜索的列上,可以加快搜索的速度;

(2) 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;

(3)   在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;

(4)   在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

(5)   在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

以下情况,不应该在这些列上创建索引:

(1)   对于那些在查询中很少使用或者参考的列不应该创建索引。降低了系统的维护速度和增大了空间需求

(2)   对于那些只有很少数据值的列也不应该增加索引。例如:人员表中的性别列,其值就是男或女,也就是说一半的记录都是重复的,这样就要考虑是否还有必要建立索引了

(3)   对于那些定义为text, image和bit类型的列不应该增加索引。这些列的数据量要么相当大,要么取值很少,不利于使用索引。

(4)   当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改操作远远多于检索操作时,不应该创建索引。

总结:索引可以提高检索的速度,但同时会降低插入,修改的效率,因为同时也要动态的维护索引。一个表不该有过多的索引,不该有重复索引。建立索引应该依照查询的要求,数据检索频繁的表应该建立索引。插入、修改频繁,查询不频繁的则要考虑是否该增加索引。

(唯一索引和主键索引的区别在于,唯一索引允许多行可以存在NULL值,主键索引不可以有NULL值。)

又成关键字,是一种逻辑结构。键代表创建来实施业务规则的完整性约束,索引和键的混淆通常是由于数据库使用索引来实施完整性约束。

1. 唯一键

  唯一键,即一个或者一组列,其中没有重复的记录。可以唯一标示一条记录。

2.主键

  属于唯一键,是一个比较特殊的唯一键。区别在于主键不可为空。

3. 外键

  如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。换而言之,如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键则该属性集是关系模式R的外键,通常在数据库设计中缩写为FK。

  外键在开发中基本使用不到,主要是数据库用来保证数据的完整性的

例如:

create table z_laopo  (id number(5) primary key,name char(20),age number(3),zhiye char(20));  ----创建老婆表
create table z_nanren
(id number(5) primary key,
 name char(20),
 age number(3),
 laopo_id number(5),
 foreign key(laopo_id) references z_laopo(id)
 );       -----创建男人表,并限定laopo_id为老婆表的外键
insert into z_laopo values (1,'fengjie',18,'accontant');
insert into z_laopo values (2,'cangjingkong',25,'teacher');
                  ----向老婆表插入记录
insert into z_nanren values (1,'nanren_1',24,1)
insert into z_nanren values (2,'nanren_2',24,2)
insert into z_nanren values (3,'nanren_3',24,3)---此行会报错,因为在z_laopo表中,不存在id为3的值

4.父键

对于有外键关系的2张表,存在外键的表所参照的表叫主表,而存在外键的表叫从表,上例中z_nanren为从表,z_laopo为主表。Lao_id为外键,z_laopo表的id为父键。

键、索引、约束的区别

一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键的混淆通常是由于数据库使用索引来实施完整性约束。

 

(1)     主键索引和主键有什么关系?

主键索引是创建主键的时候系统自动创建的索引,主键要求不重复,不为空,但是他如何判断有效率呢?当然是建索引了,老是全表遍历还不疯掉。

所以建立主键会自动的建立主键索引。

(2)     主键和唯一键的区别在于唯一键可以为空,主键不可以

(3)     建立唯一约束和唯一索引又什么区别?

同理,建立唯一约束的时候,也会自动的创建唯一索引。建立唯一索引可以说是唯一约束的一种手段。

基本上,实现起来是没有什么区别的。如果实在理解不了,就当一样好了。

(4)     聚簇索引和非聚簇索引有何区别?

这个上边已经讲和很详细了,还附有两篇文章,这里就不说了。

(5)     约束和主键有什么区别?

约束一般有主键约束,外键约束,唯一约束等。

分别为primary key,foreign key,unique 其中主键约束只是约束的一种。

其实他们是不同概念的东西。

原文地址:https://www.cnblogs.com/mysic/p/4686149.html