1. 程式人生 > >資料庫效能優化(一) 索引

資料庫效能優化(一) 索引

當前主流關係型資料庫RDBMS都是將平衡樹(B樹、B+樹)作為預設索引的資料結構。

主鍵與索引

A. 表不加主鍵,會以無序的形式一行一行的存放在磁碟上。

B. 表增加主鍵後,轉變為樹狀結構,整個表變成一個聚集索引。

索引的優缺點

優點:索引可提升表的查詢速度;為用來排序或分組的欄位新增索引,可加快分組和排序。

缺點:降低寫入速度。索引平衡樹的結構需要時刻保持正確的狀態,插入或更新資料,會改變節點中索引資料的內容,平衡樹需要重新梳理。時間成本隨資料量的增大而增大,對數級複雜度。同時索引需要複製表的資料,增加空間成本。隨著資料的插入和修改,索引的空間消耗越來越大,需定期重新build以整理索引結構,減小消耗。

聚簇索引 及 非聚簇索引

聚簇索引:也叫簇類索引,對磁碟上實際資料重新組織以按指定的一個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾乎總是比使用非聚簇索引快。

create clustered index INDEX_NAME on TABLE_NAME(COLUMN_NAME1, COLUMN_NAME2, ...)

非聚簇索引:非聚簇索引的資料行不按索引鍵值排序和儲存,且非聚簇索引的葉子節點不包含資料頁,非聚簇索引只是複製索引鍵的值組成索引結構。

每張表只能建一個聚簇索引,且建聚簇索引需要至少相當該表120%的附加空間,以存放該表的副本和索引中間頁。每建立一個非聚簇索引就會出現1個獨立的索引結構。增加表的體積,佔用空間。

create nonclustered index INDEX_NAME on TABLE_NAME(COLUMN_NAME1, COLUMN_NAME2, ...)

表查詢時,通過聚簇索引,可直接查詢到資料行;通過非聚簇索引,只能查到索引列的值和主鍵值,如果查詢的列不在索引已有資料範圍內,則需要根據主鍵回表查詢。(若select的列是非聚簇索引中包含的列,不必回表查詢時,該索引又稱“覆蓋索引”)

索引結構

索引的建立

示例

create index INDEX_BIRTHDAY on user_info(birthday) 

create index IDX_BDAY_UNAME on user_info(birthday, username)  ——聯合索引、可能是覆蓋索引

資料量大,查詢頻繁的表需要加索引。建立原則

1. 資料型別越小越好,越簡單越好

2. 索引列應避免NULL值

3. 大量重複值的列不加索引

4. 多表聯表查詢的約束條件列,應建立索引

5. 用於排序的欄位可以增加索引

6. 用於分組的欄位,應視情況增加索引

查詢條件過多的表,沒有必要加索引,幾乎等同於全表查詢。


聯合索引觸發條件(需再確認)

1. 查詢條件中的列存在於聯合索引中

2. 索引最左側的列的單條件查詢

SQL SERVER的執行計劃

USE TSQL2012

GO

select orderId from Sales.Orders

select * from Sales.Orders

執行後,會顯示SQL的開銷對比

索引型別

普通單列索引

唯一索引(欄位唯一,效率高,簡化管理)

主鍵索引(主鍵、聚簇索引)

外來鍵索引(外來鍵、非聚簇索引)

複合索引(聯合索引、聯合覆蓋)

全文索引

SQLServer、MySql、Oracle的索引區別

SQLServer會將主鍵預設設定為聚簇索引,若該表是聯合主鍵,如(term, name),則先按term排序,若term相同,按name排序。外來鍵會預設設定為非聚簇索引。