zoukankan      html  css  js  c++  java
  • 索引、键、约束

    聚簇索引和非聚簇索引详细介绍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 其中主键约束只是约束的一种。

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

  • 相关阅读:
    设计模式享元模式实现C++
    并查集
    设计模式代理模式实现C++
    设计模式装饰模式实现C++
    最小生成树Prim算法实现
    图的邻接矩阵存储
    威佐夫博弈(Wythoff Game)初识 HDU 1527 POJ 1067
    设计模式原型模式实现C++
    三种经典博弈问题 BashGame;WythoffGame;NimmGame;
    设计模式外观模式实现C++
  • 原文地址:https://www.cnblogs.com/mysic/p/4686149.html
Copyright © 2011-2022 走看看