sql 索引知識

2021-06-04 02:39:33 字數 2704 閱讀 8009

索引

可以利用索引快速訪問資料庫表中的特定資訊。索引是對資料庫表中乙個或多個列(例如,employee   表的姓氏   (lname)   列)的值進行排序的結構。如果想按特定職員的姓來查詢他或她,則與在表中搜尋所有的行相比,索引有助於更快地獲取資訊。

索引提供指標以指向儲存在表中指定列的資料值,然後根據指定的排序次序排列這些指標。資料庫使用索引的方式與使用書的目錄很相似:通過搜尋索引找到特定的值,然後跟隨指標到達包含該值的行。

通常情況下,只有當經常查詢索引列中的資料時,才需要在表上建立索引。索引將占用磁碟空間,並且降低新增、刪除和更新行的速度。不過在多數情況下,索引所帶來的資料檢索速度的優勢大大超過它的不足之處。然而,如果應用程式非常頻繁地更新資料,或磁碟空間有限,那麼最好限制索引的數量。

索引型別

根據資料庫的功能,可在資料庫設計器中建立三種型別的索引   —   唯一索引、主鍵索引和聚集索引。

提示       儘管唯一索引有助於找到資訊,但為了獲得最佳效能,建議使用主鍵約束或唯一約束。

唯一索引

唯一索引不允許兩行具有相同的索引值。

主鍵索引

資料庫表通常有一列或列組合,其值用來唯一標識表中的每一行。該列稱為表的主鍵。

在資料庫關係圖中為表定義乙個主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特殊型別。主鍵索引要求主鍵中的每個值是唯一的。

聚集索引

聚集索引中,表中各行的物理順序與鍵值的邏輯(索引)順序相同。表只能包含乙個聚集索引。

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

在   microsoft?   sql   server?   資料庫中可以建立聚集索引。在聚集索引中,表中各行的物理順序與索引鍵值的邏輯(索引)順序相同。表只能包含乙個聚集索引。聚集索引通常可加快   update   和   delete   操作的速度,因為這兩個操作需要讀取大量的資料。建立或修改聚集索引可能要花很長時間,因為執行這兩個操作時要在磁碟上對錶的行進行重組。

可考慮將聚集索引用於:  

1:包含數量有限的唯一值的列,如   state   列只包含   50   個唯一的州**。

2:使用下列運算子返回乙個範圍值的查詢:between、> 、> =、 <   和   <=。

3:返回大結果集的查詢。   (摘自microsoft?   sql   server?幫助)

聚集索引對於那些經常要搜尋範圍值的列特別有效。使用聚集索引找到包含第乙個值的行後,便可以確保包含後續索引值的行在物理相鄰。例如,如果應用程式執行的乙個查詢經常檢索某一日期範圍內的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然後檢索表中所有相鄰的行,直到到達結束日期。這樣有助於提高此類查詢的效能。同樣,如果對從表中檢索的資料進行排序時經常要用到某一列,則可以將該錶在該列上聚集(物理排序),避免每次查詢該列時都進行排序,從而節省成本。

當索引值唯一時,使用聚集索引查詢特定的行也很有效率。例如,使用唯一雇員   id   列   emp_id   查詢特定雇員的最快速的方法,是在   emp_id   列上建立聚集索引或   primary   key   約束。

在建立聚集索引之前,應先了解您的資料是如何被訪問的。可考慮將聚集索引用於:  

1   包含大量非重複值的列。

2   使用下列運算子返回乙個範圍值的查詢:between、> 、> =、 <   和   <=。

3   被連續訪問的列。

4   返回大型結果集的查詢。

5   經常被使用聯接或   group   by   子句的查詢訪問的列;一般來說,這些是外來鍵列。對   order   by   或   group   by   子句中指定的列進行索引,可以使   sql   server   不必對資料進行排序,因為這些行已經排序。這樣可以提高查詢效能。

6   oltp   型別的應用程式,這些程式要求進行非常快速的單行查詢(一般通過主鍵)。應在主鍵上建立聚集索引。  

聚集索引不適用於:  

1   頻繁更改的列   這將導致整行移動(因為   sql   server   必須按物理順序保留行中的資料值)。這一點要特別注意,因為在大資料量事務處理系統中資料是易失的。

2   寬鍵     來自聚集索引的鍵值由所有非聚集索引作為查詢鍵使用,因此儲存在每個非聚集索引的葉條目內。

說明 如果該錶上尚未建立聚集索引,且在建立   primary   key   約束時未指定非聚集索引,primary   key   約束會自動建立聚集索引。

注意事項

定義聚集索引鍵時使用的列越少越好,這一點很重要。如果定義了乙個大型的聚集索引鍵,則同乙個表上定義的任何非聚集索引都將增大許多,因為非聚集索引條目包含聚集鍵。當把   sql   指令碼儲存到可用空間不足的磁碟上時,索引優化嚮導不返回錯誤。

(摘自microsoft?   sql   server?幫助)

關於建索引的原則,我也希望能整理一下,做成乙個faq。

先說有問題的索引,可以反過來看建索引的原則:

1、表上沒有索引,導致全表掃瞄。

2、建立索引的表太小,沒有必要建索引。

3、索引中的每一行資料對應過多的表中的行,如對性別建索引。

4、對於在where中出現,但總是與函式或操作符一起使用的字段建索引,這樣的索引不起作用。

5、表上太多索引,特別是在oltp系統,造成插入緩慢。

6、索引項太大。

7、不合理的復合索引。

SQL 基礎知識梳理(七) 索引

索引的概念 在關係型資料庫中,索引是對資料庫表中一列或多列的值進行排序的一種結構。sql server中有索引的型別 按儲存結構區分 聚集索引 又稱聚類索引,簇集索引 分聚集索引 非聚類索引,非簇集索引 按資料唯一性區分 唯一索引 非唯一索引 按鍵列個數區分 單列索引 多列索引 聚集索引和非聚集索引...

SQL 索引 建立索引

create index 語句用於在表中建立索引。在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查詢資料。您可以在表中建立索引,以便更加快速高效地查詢資料。使用者無法看到索引,它們只能被用來加速搜尋 查詢。注釋 更新乙個包含索引的表需要比更新乙個沒有索引的表更多的時間,這是由於索引本身也需要...

SQL優化(SQL 索引)

檢視表定義 show create table users 檢視表的索引 show index from users 你要獲取第乙個表的所有資訊,你說全表掃瞄快呢還是索引掃瞄快呢?所以當你查詢庫 包括left join中的臨時庫 的所有資訊時,資料庫會選擇最優方法 全表掃瞄!s表dept id na...