資料庫 索引

2022-03-17 17:06:51 字數 3011 閱讀 8989

索引屬於物理儲存的路徑概念,而不是邏輯概念。在執行乙個查詢時,系統會自動選擇合適的索引作為資料訪問路徑,使用者不必也不能選擇索引。

加快查詢速度

dba或 建表人

dbms一般會自動建立以下列上的索引:

primary keyunique

dbms自動完成

dbms自動選擇是否使用索引以及使用哪些索引

1、可以加快有連線表、排序或分組操作的查詢的速度

2、若建立了唯一索引,可強制值的唯一性

3、索引的建立和維護是公升序或降序的

4、索引最好建立在具有高度選擇性的列上,即列或列組合的值大部分是唯一的

1、增加了資料庫的儲存空間

【我們假設在一張表中的一條記錄在磁碟上占用1kb話,我們對其中10b的乙個字段建立索引,那麼該記錄對應的索引塊的大小只有10b,如果一張表的的資料量比較大,大約100,000條,那麼用來儲存索引耗費的空間就是100,000x10b=1000,000b=10000kb=1mb,換句話說,這張白表也因為這個索引的建立而多使用了大約1mb的儲存空間,當然對與大批量資料來說,這麼點空間是不足為道的。但事實是,索引確實耗費了更多空間;】

2、在插入和修改資料時要花費較多的時間(因為索引也要隨之變動);

還有就是,對某些場景下,資料量不是特別大的情況下,對於某些新增索引的行為,不但不能優化查詢速度,反而會減慢查詢速度,當然,如果索引的建立不恰當,所選擇建立索引的字段不合適,也可能會削弱查詢速度,當然在資料量不大的情況下,基於sql伺服器本身強大的處理能力,這種削弱表現是非常微弱的,但是一旦資料量大起來,原本可以不需要考慮索引就能很快查詢出來資料的,結果因為新增了索引反而加重了查詢資料的消耗,不恰當的索引方式造成的影響就會表現的很明顯;

所以,索引不是萬能的,某些情況下,新增索引可能比不新增索引更慢!

1、聚簇索引

為了提高某個屬性的查詢速度,把這個或這些屬性上具有相同值的元組集中存放在連續的物理塊中稱為「聚簇」,該屬性稱為「聚簇碼」

【平時習慣逛圖書館的童鞋可能比較清楚,如果你要去圖書館借一本書,最開始是去電腦裡面查書名然後根據書名來定位藏書在那個區,哪個書櫃,哪一行,第多少本。。。清晰明確,一目了然,因為藏書的結構與圖書室的位置,書架的順序,書本的擺放順序與書籍的編號都是從大到小一致的順序擺放的,所以很容易找到。比如,你的目標藏書在c區2櫃3排5倉,那麼你走到b區你就很快知道前面就快到了c區了,你直接奔著2櫃區就能找到了。 這就是雷同於聚簇索引的功效了】

記錄的索引順序與物理順序相同。顯然,乙個表只能包含乙個聚簇索引(如主鍵列)。在聚簇索引下,因為其物理儲存的特徵,可以避免大範圍的資料掃瞄(尤其是有重複的索引列值進行範圍查詢時),因此它有更快的資料訪問速度。

2、非聚簇索引

【同樣的,如果你去的不是圖書館,而是某城市的商業性質的圖書城,那麼你想找的書就擺放比較隨意了,由於商業圖書城空間比較緊正,藏書通常按照藏書上架的先後順序來擺放的,所以如果查詢到某書籍放在c區2櫃3排5倉,但你可能要繞過f區,而不是a.b.c.d...連貫一致的,也可能同在c區的2櫃,書櫃上第一排是計算機類的書記,也可能最後一排就是醫學類書籍;】

記錄的索引順序與物理順序沒有必然關係。非聚簇索引不重新組織表中資料的順序,乙個表可以有多個非聚簇索引,每乙個都提供訪問資料的不同排序順序。建立時若未指定索引型別,則預設為非聚簇索引。

3、唯一索引

不允許其中任何兩行具有相同索引值的索引。資料庫可能會阻止表中建立重複鍵值的新資料。鍵值的惟一性通過unique 關鍵字顯式維護,或通過乙個內部的對使用者不可見的惟一識別符號隱式維護,常將唯一值的列建立為聚簇索引。 

(1)索引由dba和dbo(表的屬主)負責建立於刪除,由dbms自動維護。

(3)根據查詢要求建立索引,對於查詢頻度高,實時性高的資料一定要建索引。在查詢中不常被引用的列不要建立索引。

(4)主鍵列缺省自動建立聚簇索引。

(5)外來鍵列、或在表連線操作中經常用到的列建立索引,可加快連線查詢的速度。

(6)常被搜尋鍵值範圍的列建立索引,如條件「sage between 18 and 20」,建議對sage列建立索引。

(7)常以排序形式訪問的列建立索引,如在order by字後出現的列。

(8)常在聚集操作中處於同一組的列建立索引,如在group by字後出現的列。

語句格式 :create [unique] [clustered(聚簇索引)/ nonclustered(非聚簇索引) ] index 《索引名》 on 《表名》(《列名》[《次序》][,《列名》[《次序》] ]…);

[例] 在student表的sname(姓名)列上建立乙個聚簇索引。

create clustered index stusname on student(sname);

[例] 為學生-課程資料庫中的student,course,sc三個表建立索引。其中student表按學號公升序建唯一索引,course表按課程號公升序建唯一索引,sc表按學號公升序和課程號降序建唯一索引

create unique index stusno on student(sno);

create unique index coucno on course(cno);

create unique index scno on sc(snoasc,cno desc);

索引建立後,由系統來選擇和維護,使用者無權干預。但有些索引的維護反而加重了系統的負擔,就不得不將其刪除。

語法格式: drop index 《表名.索引名》;

由於不同的表可能建立了名字相同的索引,所以在刪除索引時要求索引名前必須有表名做字首。刪除索引時,系統會從資料字典中刪去有關該索引的描述。

[例] 刪除student表的stusname索引

drop index student.stusname;

參考:

[1]   和剛入門的菜鳥們聊聊--什麼是聚簇索引與非聚簇索引

資料庫 資料庫索引

索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...

資料庫索引

索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...