zoukankan      html  css  js  c++  java
  • SQL 创建索引,语法

    索引介绍。及原理

    主键,唯一索引 聚集索引的关系


    当数据库表的数据太过庞大,的时候我们能够通过加入索引的形式解决。

    聚集索引:数据的实际存储顺序与我们做索引的顺序是一致的,这样的索引我们将它成为聚集索引。

    非聚集索引: 数据的实际存储顺序与我们做的索引顺序不一致的时候,像这样的高速查找数据的索引我们将它成为非聚集索引。







    --unique唯一索引。clustered聚集索引。nonclustered非聚集索引 。主键是唯一的。所以创建了一个主键的同一时候,也就这个字段创建了一个唯一的索引。

    SQL SERVER将主键默认定义为聚集索引。其实,索引是否唯一与是否聚集是不相关的。聚集索引能够是唯一索引,也能够是非唯一索引。 唯一索引实际上就是要求指定的列中全部的数据必须不同 /* 主键一唯一索引的差别: 1 一个表的主键仅仅能有一个。而唯一索引能够建多个。 2 主键能够作为其他表的外键。 3 主键不可为null。唯一索引能够为null。 聚集索引:将表内的数据依照一定的规则进行排列的文件夹。正由于如此,一个表中的聚焦索引仅仅有一个。对此我们要注意“主键就是聚焦索引”这是极端错误的,是对聚焦索引的一种浪费。(尽管SQLServer默认主键就是聚焦索引)使用聚焦索引的最大优点就是依照查询要求,迅速缩小查询范围,避免进行全表扫描。

    其次让每一个数目都不同样的字段作为聚焦索引也不符合“大数目不同情况下不应建立聚集索引的原则”。 */ use sales if(exists (select * from sys.indexes where name='IX_TEST_TName')) drop index T_TESX.TX_TEST_TName --假设IX_TEST_TName存在则删除该索引(注意删除索引的时候是 表名.索引名) create nonclustered index IX_TEST_TName --创建一个非聚集索引索引 on T_Test(name) --为T_Test表的name字段创建索引 with fillfachor=30 --填充因子为30% 。

    能够省略with fillfachor=30这一句,省略即默认 go

    ~

    唯一索引与主键索引的比較 
    
    
    唯一索引
     唯一索引不同意两行具有同样的索引值。
     假设现有数据中存在反复的键值,则大多数数据库都不同意将新创建的唯一索引与表一起保存。

    当新数据将使表中的键值反复时。数据库也拒绝接受此数据。比如,假设在 employee 表中的职员姓氏(lname) 列上创建了唯一索引,则全部职员不能同姓。 主键索引 主键索引是唯一索引的特殊类型。 数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。

    在数据库关系图中为表定义一个主键将自己主动创建主键索引。主键索引是唯一索引的特殊类型。主键索引要求主键中的每一个值是唯一的。

    当在查询中使用主键索引时,它还同意高速訪问数据。

    它们的一些比較: (1)对于主健/unique constraint , oracle/sql server/mysql等都会自己主动建立唯一索引; (2)主键不一定仅仅包括一个字段。所以假设你在主键的当中一个字段建唯一索引还是必要的; (3)主健可作外健,唯一索引不可。 (4)主健不可为空。唯一索引可; (5)主健也但是多个字段的组合。 (6)主键与唯一索引不同的是: a.有not null属性。 b.每一个表仅仅能有一个。 1、主键 主键ID,主键既是约束也是索引,同一时候也用于对象缓存的键值。

    2、索引 *组合或者引用关系的子表(数据量较大的时候)。须要在关联主表的列上建立非聚集索引(如订单明细表中的产品ID字段、订单明细表中关联的订单ID字段) *索引键的大小不能超过900个字节,当列表的大小超过900个字节或者若干列的和超过900个字节时。数据库将报错。

    *表中假设建有大量索引将会影响INSERT、UPDATE和DELETE语句的性能,由于在表中的数据更改时,全部的索引都将必须进行适当的调整。须要避免对常常更新的表进行过多的索引,而且索引应保持较窄,就是说:列要尽可能的少。 *为常常常使用于查询的谓词创建索引,如用于下拉參照高速查找的code、name等。在平台现有下拉參照的查询sql语句中的like条件语句要改成不带前置通配符。

    还有须要关注Order By和Group By谓词的索引设计,Order By和Group By的谓词是须要排序的。某些情况下为Order By和Group By的谓词建立索引,会避免查询时的排序动作。 *对于内容基本反复的列。比方仅仅有1和0,禁止建立索引,由于该索引选择性极差,在特定的情况下会误导优化器做出错误的选择,导致查询速度极大下降。 *当一个索引有多个列构成时,应注意将选择性强的列放在前面。仅仅前后次序的不同,性能上就可能出现数量级的差异。 *对小表进行索引可能不能产生优化效果,由于查询优化器在遍历用于搜索数据的索引时,花费的时间可能比运行简单的表扫描还长。设计索引时须要考虑表的大小。

    记录数不大于100的表不要建立索引。频繁操作的小数量表不建议建立索引(记录数不大于5000条)




    
    
  • 相关阅读:
    uva 442 Matrix Chain Multiplication
    结对编程项目之队友代码分析
    [转] 为什么要使用NoSQL
    Compare Linq2Sql with NHibernate
    使用linq2sql 的DetailView 如何保存多对多关系
    工作流入门
    XML字段的用处
    DesignTimeResourceProviderFactory 不给力啊
    如何给XMLDatasource做分页和排序
    ORM的烦恼
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6703497.html
Copyright © 2011-2022 走看看