数据库中的索引、键和约束

一.索引

1.什么是索引?

索引是对数据库表中一列或多列的值进行排序的一种结构。

在关系型数据库中,索引是一种与表有关的数据库结构,是事实存在的。它可以使对于表的select等等操作更加快速,相当于一本书的目录。

对于一张表,如果我们想要找到某一列符合特定值的记录,第一种方法是全表搜索,匹配,然后把所有符合的记录列出,但是这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。由此可知,索引是要消耗数据库空间的。

并非所有的数据库都以相同的方式使用索引。作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。在多数情况下,索引用于数据检索的速度优势大大超过它的不足之处。但是,如果应用程序非常频繁地更新数据或磁盘空间有限,则可能需要限制索引的数量。

可以使用单列作为索引,也可以使用多列联合作为索引。

2.索引的优缺点

优点:

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

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

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

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

缺点:

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

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

建立索引时的注意事项:

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

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

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

3.一些索引类别

(1)普通索引

也即不加任何限制的索引。

(2)唯一索引

一种索引,不允许具有索引值相同的行,从而禁止重复的索引或键值。系统在创建该索引时检查是否有重复的键值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查。

(3)主键索引

数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。它和唯一索引的共性在于都不允许有重复记录,区别在于,唯一索引是不限制null的,也就是说或可以有一条以上的null值插入,但是主键却限定不能为空。

(4)聚簇索引和非聚簇索引

聚簇索引也叫簇类索引,是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页。

聚簇是根据码值找到数据的物理存储位置,从而达到快速检索数据的目的。Oracle聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点。非聚簇索引的顺序与数据物理排列顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。由于聚簇索引要按照索引排序,所以一个表最多只能有一个聚簇索引,但可以使用多列。

ORACLE中的聚簇表是指两个表有一个字段完全相同,并且在业务中经常会按这个字段为目标连接这两个表,这时建立聚簇表,

两个表公用一个字段,能减少占用空间,并能明显提高连接查询速度。

这两篇都有实际的例子,这里就不再深入讨论了。

建立聚簇索引的思想

1、大多数表都应该有聚簇索引或使用分区来降低对表尾页的竞争,在一个高事务的环境中,对最后一页的封锁严重影响系统的吞吐量。   

2、在聚簇索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查(between、<、<=、<>、>=)或使用group by或orderby的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行保证物理上毗连在一起而不必进一步搜索,避免了大范围扫描,可以大大提高查询速度。   

3、在一个频繁发生插入操作的表上建立聚簇索引时,不要建在具有单调上升值的列(如IDENTITY)上,否则会经常引起封锁冲突。   

4、在聚簇索引中不要包含经常修改的列,因为码值修改后,数据行必须移动到新的位置。   

5、选择聚簇索引应基于where子句和连接操作的类型。

具体的聚簇索引请参考以下文章:

http://blog.sina.com.cn/s/blog_607b68cc0100f5jo.html

http://space.itpub.net/9778796/viewspace-660186

二.键

1.什么叫键

数据库中的键(key)又称为关键字,是关系模型中的一个重要概念,它是逻辑结构,不是数据库的物理部分。

2.唯一键

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

3.主键

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

4.外键

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

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

举个简单的例子

表A内有列C1

表B内有列C2

将C2的外键指向C1

那么当你向表B插入数据时,C2的内容必须为C1中的一个

还有几个约束需要你设置

如删除或者修改表A中的字段时怎么处理表B中相关联的数据

5.父键

对于有外键关系的2张表,存在外键的表所参照的表叫主表,而存在外键的表叫从表。

三.约束

像主键、唯一等等其实都是一种约束。

其中主键约束比唯一约束更严格,不能为空。

四.键、索引、约束的区别

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

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

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

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

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

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

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

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

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

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

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

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

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

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

转载地址:http://blog.csdn.net/dlodj/article/details/7017331

时间: 2024-12-25 05:50:08

数据库中的索引、键和约束的相关文章

oracle数据库中提供的5种约束

约束作用:用来保持数据的完整性,防止无效数据进入到数据库中.oracle数据库中提供的5种约束,都是限定某个列或者列的组合的.1.主键约束(PRIMARY KEY):在一个表中能唯一的标识一行.主键可以限定在多个列上.2.唯一键约束(UNIQUE key):在一个表中能唯一的标识一行,唯一键也可以限定在多个列上.主键和唯一键的区别:a.一个表中最多只能有一个主键.可以多个唯一键.b.主键所限定的列不能为null,唯一键所限定的列可以为null.3.外键约束(FOREIGN key):   引用表

SQL数据库中的主键与外键的介绍

一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 : 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 用户表(用户名.密码.登录级别) 其中用户名是唯一的, 用户名就是一个主键 上机记录表(卡号,学号,姓名.序列号) 上机记录表中单一一个属性无法唯一标识一条记录,学号和姓名的组合才可以唯一标识一条记录,所以 学号和姓名的属性组是一个主键 上机记录表中的序列号不是成绩表的

数据库中的索引Index

索引就像一本书的目录,而书中的索引是对一个词语的列表,其中注明了包含各个词的页码.数据库中的索引 是某一个表中一列或者若干列值的集合和相应的只想表中物理标识这些值的数据页的逻辑指针清单. 索引的作用: 1.通过创建唯一索引,可以保证数据记录的唯一性: 2.可以大大的加快数据检索的速度: 3.可以加速表与表之间的连接: 4.在使用ORDER BY 和GROUP BY 子句中进行检索数据是,可以显著减少查询中分组和排序的时间: 5.使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能: 索引分

SQLSEVER 中的那些键和约束

SQL Server中有五种约束类型,各自是 PRIMARY KEY约束.FOREIGN KEY约束.UNIQUE约束.DEFAULT约束.和CHECK约束.查看或者创建约束都要使用到 Microsoft SQL Server Managment Studio. 1. PRIMARY KEY约束 在表中常有一列或多列的组合,其值能唯一标识表中的每一行.这种一列或多列成为表的主键(Primary Key). 一个表仅仅能有一个主键,并且主键约束中的列不能为空值. 查看PRIMARY KEY约束能够

数据库中使用外键和不使用外键有什么区别

今天听了一个企业技术总监的宣讲,结果听说在他开发系统的过程中,都没有用到外键,这让我很惊讶,赶紧上网搜索了一些资料看了看,终于明白了不用外键的原因.这是一篇关于是否使用外键的讨论,讲的很有道理:对于主/外键/索引来说,在一些开发团队中被认为是处理数据库关系的利器,也被某些开发团队认为是处理某些具体业务的魔鬼,您的观点呢?在实际应用中您会采取哪种方式?大家共同观点:主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作,矛盾焦点:数据库设计是否需要外键.这里有两个问题:一个是如何

MySQL数据库中的索引(一)——索引实现原理

今天我们来探讨一下数据库中一个很重要的概念:索引. MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,即索引是一种数据结构. 我们知道,数据库查询是数据库的最主要功能之一.我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化.最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary searc

数据库中的主键和外键

关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号 姓名 性别 班级) 其中每个学生的学号是唯一的,学号就是一个主键 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是一个主键 成绩表(学号,课程号,成绩) 成绩表中单一一个属性无法唯一标识一条记录学号和课程号的组合才可以唯一标识一条记录,所以学号和课程号的属性组是一个主键 成绩表中的学号不是成绩表的主键但它和学生表中的学号相对应并且学生表中

数据库中的主键

主键:表中经常有一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键.一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值.由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列. 作用 :1)保证实体的完整性; 2)加快数据库的操作速度 3) 在表中添加新记录时,ACCESS会自动检查新记录的主键值,不允许该值与

如何在数据库中使用索引

多数数据库,使用 B 树(Balance Tree)的结构来保存索引. B 树, 最上层节点:根节点 最下层节点:叶子节点 两者之间的节点:中间节点 B 树,显著特征:从根节点,到各个叶子节点的距离都是相等的.如此,检索任何值时,都经过相同数目的节点. [sql] CREATE INDEX idx_lname_pinyin ON employee(lname_pinyin); SHOW INDEX FROM employee\G DROP INDEX idx_lname_pinyin ON em