索引和主鍵

2021-07-04 00:00:21 字數 1422 閱讀 8920

主鍵是錶行資料的唯一標識,具有唯一性和非空屬性,索引主要作用是用於查詢,提供查詢速度的。

1. 什麼是索引

索引是sqlserver編排資料的內部方法,是檢索表中資料的直接通道。它類似漢語詞典裡面的拼音目錄,通過它可以快速查詢到某個字詞。

索引頁是資料庫中儲存說要的資料頁。索引頁存放檢索資料行的關鍵字頁及資料行的位址指標。索引頁類似於漢語字典中按拼音或筆畫排序的目錄頁。

2. 索引分類

唯一索引: 建立唯一約束會自動建立唯一索引。 它對應的列中僅允許有乙個null值。

主鍵索引: 是唯一索引的一種特殊型別。建立主鍵會自動建立主鍵索引。 要求主鍵中的每個值是非空,唯一的。

聚集索引: 表中各行的物理順序與鍵值的邏輯順序相同。

非聚集索引: 表中各行資料存放的物理順序與鍵值的邏輯順序不匹配。聚集索引比非聚集索引有更快的資料訪問速度。

復合索引: 將多個列組合作為索引

全文索引: 是一種特殊型別的寄語標記的功能型索引,由sql server 中全文引擎服務建立和維護。

3. 建立索引

方法一: 使用 ssms 建立索引

方法二: 使用t-sql語句建立

語法:create  [unique] [clustered  |   nonclustered]  index  index_name

on  table_name  (column_name[, column_name] ...)

[with  fillfactor=x]

說明: fillfactor 表示填充因子, 指定乙個1-100的值,該值指定索引頁填充的空間所佔的百分比。

4. 檢視索引

方法一: 用系統儲存過程 sp_helpindex檢視

exec  sp_helpindex  表名

方法二: 用檢視 sys.indexes 檢視

use  database

select * from sys.indexes

5. 刪除索引

if  exists (select name from sysindexes  where name = index_name)

drop index table.index_name

6. 注意事項

針對以下情況建立索引:

頻繁搜尋的列

經常用作查詢選擇的列

經常排序、分組的列

經常用作連線的列(主外來鍵)

針對以下情況不建立索引:

僅包含幾個不同值的列

表中僅包含幾行資料

經驗:查詢是盡量少用 "*" 返回全部列,不要返回不需要的列

索引盡量在位元組數少的列上建立索引

where 字句中有多個表示式時,包含索引列的表示式應置於其他料件表示式之前

避免在order by 子句中使用表示式

根據業務資料發生頻繁,定期重新生成或重新組織索引,進行碎片整理

主鍵索引和非主鍵索引

對於一張資料表,id為主鍵 非主鍵索引和主鍵索引的區別是 非主鍵索引的葉子節點存放的是主鍵的值,主鍵索引的葉子節點存放的是整行資料。其中,非主鍵索引又稱為二級索引,主鍵索引又稱為聚簇索引。根據這兩種結構我們來進行下查詢,看看他們在查詢上有什麼區別。1 如果查詢語句是 select from tabl...

mysql非主鍵索引 主鍵索引和非主鍵索引的區別

1.什麼是最左字首原則?以下回答全部是基於mysql的innodb引擎 例如對於下面這一張表 如果我們按照 name 欄位來建立索引的話,採用b 樹的結構,大概的索引結構如下 如果我們要進行模糊查詢,查詢name 以 張 開頭的所有人的id,即 sql 語句為 select id from tabl...

mysql非主鍵索引 主鍵索引和非主鍵索引解析

1.什麼是最左字首原則?以下回答全部是基於mysql的innodb引擎 例如對於下面這一張表 如果我們按照 name 欄位來建立索引的話,採用b 樹的結構,大概的索引結構如下 如果我們要進行模糊查詢,查詢name 以 張 開頭的所有人的id,即 sql 語句為 select id from tabl...