主鍵和聚集索引和單列索引和多列索引

字號(hào):


    1. 主鍵與聚集索引
    首先澄清一個(gè)概念,主鍵并不等于聚集索引。(這不是廢話么,如果是同一個(gè)東西,微軟也不會(huì)叫兩個(gè)不同的名字了)
    一個(gè)表只能有一個(gè)聚集索引,數(shù)據(jù)在物理上是按照聚集索引的順序來(lái)存放的。
    主鍵分為聚集的主鍵和非聚集的主鍵。默認(rèn)是聚集的主鍵。下面代碼是SqlServer自動(dòng)生成的CREATE TABLE 代碼,注意設(shè)定主鍵那句話中的'
    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. 多列索引和多個(gè)單列索引
    考慮兩種不同的建立索引方式:
    case 1:對(duì)c1,c2,c3三列按此順序添加一個(gè)多列索引;
    case 2: 對(duì)c1,c2,c3分別建立三個(gè)單列索引;
    問(wèn)題1:按c1搜索時(shí),哪種索引效率快?
    答:case2
    問(wèn)題2:按C2搜索時(shí),哪種索引效率快?
    答:case2,并且,case1的索引無(wú)效
    問(wèn)題3:按C1,C2搜索時(shí)哪種效率快?
    答:不知道
    問(wèn)題四:按C1,C2,C3搜索哪種效率快?
    答:case1
    問(wèn)題五:按C2,C3,C1搜索時(shí)哪種效率快?
    答:case2,因?yàn)闆](méi)有按多列索引的順序搜索,case1的索引沒(méi)有使用到。
    3. 覆蓋查詢(xún)
    所謂覆蓋查詢(xún)簡(jiǎn)單的說(shuō)就是所有查詢(xún)列被所使用的索引覆蓋的查詢(xún)。
    4. 單個(gè)表中索引太多的負(fù)面影響
    當(dāng)一個(gè)表存在多個(gè)(單列)索引,將造成Delete ,update ,insert操作需要花費(fèi)大量的時(shí)間刪除索引和重建索引。
    通過(guò)把多個(gè)(單列)索引合并成一個(gè)(多列)索引后,測(cè)試得出Delete ,update ,insert操作時(shí)需要花費(fèi)的時(shí)間大大縮短。但是這樣可能會(huì)對(duì)之前單列索引字段的查詢(xún)性能有影響。個(gè)中好處,權(quán)衡取舍。