视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
主键和聚集索引和单列索引和多列索引
2020-11-09 13:43:09 责编:小采
文档


1. 主键与聚集索引 首先澄清一个概念,主键并不等于聚集索引。(这不是废话么,如果是同一个东西,微软也不会叫两个不同的名字了) 一个表只能有一个聚集索引,数据在物理上是按照聚集索引的顺序来存放的。 主键分为聚集的主键和非聚集的主键。默认是聚集的主

  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操作时需要花费的时间大大缩短。但是这样可能会对之前单列索引字段的查询性能有影响。个中好处,权衡取舍。

下载本文
显示全文
专题