主键和聚集索引和单列索引和多列索引

   1. 主键与聚集索引

  首先澄清一个概念,主键并不等于聚集索引。(这不是废话么,如果是同一个东西,微软也不会叫两个不同的名字了)

  一个表只能有一个聚集索引,数据在物理上是按照聚集索引的顺序来存放的。

  主键分为聚集的主键和非聚集的主键。默认是聚集的主键。下面代码是SqlServer自动生成的CREATE TABLE 代码,注意设定主键那句话中的'

  CLUSTERED',即表示聚集的主键。

  /****** Object: Table [dbo].[User] Script Date: 03/28/2014 15:14:53 ******/

  SET ANSI_NULLS ON

  GO

  SET QUOTED_IDENTIFIER ON

  GO

  CREATE TABLE [dbo].[User](

  [Id] [int] IDENTITY(1,1) NOT NULL,

  [SchoolId] [nvarchar](50) NOT NULL,

  [StudentId] [nvarchar](50) NOT NULL,

  [TimeLine] [nvarchar](50) NOT NULL,

  [Name] [nvarchar](50) NULL,

  [Phone] [nvarchar](50) NULL,

  [Gender] [nvarchar](50) NULL,

  [Age] [smallint] NULL,

  [IdCard] [nvarchar](50) NULL,

  [Nation] [nvarchar](50) NULL,

  [Party] [nvarchar](50) NULL,

  [Birthday] [nvarchar](50) NULL,

  [Married] [nvarchar](50) NULL,

  [School] [nvarchar](50) NULL,

  [Degree] [nvarchar](50) NULL,

  [Province] [nvarchar](50) NULL,

  [City] [nvarchar](50) NULL,

  [Area] [nvarchar](50) NULL,

  [Address] [nvarchar](50) NULL,

  [College] [nvarchar](50) NULL,

  [Major] [nvarchar](50) NULL,

  [Class] [nvarchar](50) NULL,

  [Extra] [text] NULL,

  PRIMARY KEY CLUSTERED

  (

  [Id] ASC

  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

  ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

  GO

  2. 多列索引和多个单列索引

  考虑两种不同的建立索引方式:

  case 1:对c1,c2,c3三列按此顺序添加一个多列索引;

  case 2: 对c1,c2,c3分别建立三个单列索引;

  问题1:按c1搜索时,哪种索引效率快?

  答:case2

  问题2:按C2搜索时,哪种索引效率快?

  答:case2,并且,case1的索引无效

  问题3:按C1,C2搜索时哪种效率快?

  答:不知道

  问题四:按C1,C2,C3搜索哪种效率快?

  答:case1

  问题五:按C2,C3,C1搜索时哪种效率快?

  答:case2,因为没有按多列索引的顺序搜索,case1的索引没有使用到。

  3. 覆盖查询

  所谓覆盖查询简单的说就是所有查询列被所使用的索引覆盖的查询。

  4. 单个表中索引太多的负面影响

  当一个表存在多个(单列)索引,将造成Delete ,update ,insert操作需要花费大量的时间删除索引和重建索引。

  通过把多个(单列)索引合并成一个(多列)索引后,测试得出Delete ,update ,insert操作时需要花费的时间大大缩短。但是这样可能会对之前单列索引字段的查询性能有影响。个中好处,权衡取舍。

时间: 2024-08-04 10:18:08

主键和聚集索引和单列索引和多列索引的相关文章

SQL Server 索引和表体系结构(包含列索引)

原文:SQL Server 索引和表体系结构(包含列索引) 包含列索引 概述 包含列索引也是非聚集索引,索引结构跟聚集索引结构是一样,有一点不同的地方就是包含列索引的非键列只存储在叶子节点:包含列索引的列分为键列和非键列,所谓的非键列就是INCLUDE中包含的列,至少需要有一个键列,且键列和非键列不允许重复,非键列最多允许1023列(也就是表的最多列-1),由于索引键列(不包括非键)必须遵守现有索引大小的限制(最大键列数为 16,总索引键大小为 900 字节)的要求所以引进了包含列索引. 正文

Cassandra1.1.1建立复合主键后,如何再建立二级索引? -

最近在使用Cassandra,版本为1.1.1, CQL版本为3.0.0.遇到如下问题. 目标:利用复合主键进行查询和排序,并想利用二级索引进行多条件查询. 首先CQL建表,用到复合主键(instigator, startedAt): &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; CREATE TABLE altercations ( instigator text, startedAt text, ships

认识SQLServer索引以及单列索引和多列索引的不同

 一.索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录可以快速找到你想要的信息,而不需要读完全书.在数据库中,数据库程序使用索引可以重啊到表中的数据,而不必扫描整个表.书中的目录是一个字词以及各字词所在的页码列表,数据库中的索引是表中的值以及各值存储位置的列表. 索引的利弊:查询执行的大部分开销是I/O,使用索引提高性能的一个主要目标是避免全表扫

数据库模型设计——主键的设计

在数据库设计时,主要就是对实体和关系的设计,实体表现出来就是表,关系表现出来就是外键.而对于一个表,由两部分组成:主键和属性.主键的简单定义就是表中为每一行数据的唯一标识.其实更准确的说法,每一行数据的唯一标识是候选键(Candidate Key),一个表中可以有很多个候选键,主键是候选键中的一个,主要用于更方便的检索和管理数据.一个表中可以有多个候选键,但是只有一个主键.由于主键常常用于检索数据,也用于表之间的关联,所以主键的设计的好坏将会严重影响数据操作的性能.下面来介绍下主键设计的几个考虑

《MySQL DBA修炼之道》——3.6 ID主键

3.6 ID主键 下面先说明选择主键的注意事项. 1) 建议主键是整型. 2) 如果表中包含一列能够确保唯一.非空(NOT NULL),以及能够用来定位一条记录的字段,就不要因为传统而觉得一定要加上一个自增ID做主键. 3) 主键也遵从索引的一些约定,注意联合主键的字段顺序. 4) 为主键选择更有意义的名称,如ID这个名称太过笼统,表达的信息可能不准确.1.自增ID主键 自增列是MySQL里的一种特殊的整型,我们定义一个列的整型的同时,可以设置它是否为自增的,一个表只能有一个列是自增列,且自增列

【译】SQL Server索引进阶第八篇:唯一索引

原文:[译]SQL Server索引进阶第八篇:唯一索引     索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其效果适得其反,可以说"成也索引,败也索引".     本系列文章来自Stairway to SQL Server Indexes,翻译和整理后发布在agilesharp和博客园,希望对广大的技术朋友在如何使用索引上有所帮助.   唯一

oracle主键的设置方法

 主键: 1.主键约束: 一个表只能有一个主键约束.主键可以是单个字段,也可以是多个字段.无论是哪种情况,其所有字段都是NOT NULL. 2.Unique约束:一个表可以有多个Unique约束,Unique的字段可以为NULL. 3.主键与Unique:不同点在于一个表只能有一个主键约束,但是可以有多个Unique约束:主键所有字段都是not null,unique可以是 null:相同点在于都能保证唯一性. 4.主键.Unique与索引:主键约束与Unique约束默认会成为索引.当主键和Un

MySQL5.5加主键锁读问题—续

背景        上一篇说到MySQL 5.5加主键导致阻塞源表的读的问题. 有同学提到从调用函数看,在默认的old_alter_table=off的情况下,加主键过程没有看到copy to tmp table.          这里我们再细说一下.   说说fast index creation          在MySQL 5.1以后InnoDB引入了fast index creation.在有这个feature之前,MySQL认为所有的加减索引操作都必须创建临时表.拷贝数据.删除源表

深入讨论SQL Server 表的主键问题

关于数据库的逻辑设计,是一个很广泛的问题.本文主要针对开发应用中遇到在MS SQL Server上进行表设计时,对表的主键设计应注意的问题以及相应的解决办法. 主键设计现状和问题 关于数据库表的主键设计,一般而言,是根据业务需求情况,以业务逻辑为基础,形成主键. 比如,销售时要记录销售情况,一般需要两个表,一个是销售单的概要描述,记录诸如销售单号.总金额一类的情况,另外一个表记录每种商品的数量和金额.对于第一个表(主表),通常我们以单据号为主键;对于商品销售的明细表(从表),我们就需要将主表的单