資料庫索引

2021-06-09 14:10:43 字數 2348 閱讀 9647

一、索引的基本概念

索引是一種特殊型別的資料庫物件,它與表有著密切的聯絡。

索引是為檢索而存在的。如一些書籍的末尾就專門附有索引,指明了某個關鍵字在正文中的出現的頁碼位置,方便我們查詢,但大多數的書籍只有目錄,目錄不是索引,只是書中內容的排序,並不提供真正的檢索功能。可見建立索引要單獨占用空間;索引也並不是必須要建立的,它們只是為更好、更快的檢索和定位關鍵字而存在。

再進一步說,我們要在圖書館中查閱圖書,該怎麼辦呢?圖書館的前台有很多叫做索引卡片櫃的小櫃子,裡面分了若干的類別供我們檢索圖書,比如你可以用書名的筆畫順序或者拼音順序作為查詢的依據,你還可以從作者名的筆畫順序或拼音順序去查詢想要的圖書,反正有許多檢索方式,但有一點很明白,書庫中的書並沒有按照這些卡片櫃中的順序排列——雖然理論上可以這樣做,事實上,所有圖書的脊背上都人工的貼上了乙個特定的編號①,它們是以這個順序在排列。索引卡片中並沒有指明這本書擺放在書庫中的第幾個書架的第幾本,僅僅指明了這個特定的編號

二、非聚集索引

非聚集索引可以建多個,具有b樹結構,其葉級節點不包含資料頁,只包含索引行。假定乙個表中只有非聚集索引,則每個索引行包含了非聚集索引鍵值以及行定位符(row id,rid),他們指向具有該鍵值的資料行。每乙個rid由檔案id、頁編號和在頁中行的編號組成。

當indid的值在2-250之間時,意味著表中存在非聚集索引頁。此時,sqls呼叫root欄位的值指向非聚集索引b樹的root,在其中查詢與被查詢最相近的值,根據這個值找到在非葉級節點中的頁號,然後順藤摸瓜,在葉級節點相應的頁面中找到該值的rid,最後根據這個rid在heap中定位所在的頁和行並返回到查詢端。

例如:假定在lastname上建立了非聚集索引,則執行select * from memberwhere lastname=』ota』時,查詢過程是:①sqls查詢indid值為2;②立即從根出發,在非葉級節點中定位最接近ota的值「martin」,並查到其位於葉級頁面的第61頁;③僅在葉級頁面的第61頁的martin下搜尋ota的rid,其rid顯示為n∶706∶4,表示lastname欄位中名為ota的記錄位於堆的第707頁的第4行,n表示檔案的id值,與資料無關;④根據上述資訊,sqls立馬在堆的第 707頁第4行將該記錄「揪」出來並顯示於前台(客戶端)。

三、聚集索引

在聚集索引中,資料所在的資料頁是葉級,索引資料所在的索引頁是非葉級。

查詢原理和上述對非聚集索引的查詢相似,但由於記錄是按照聚集索引中索引鍵值進行排序,換句話說,聚集索引的索引鍵值也就是具體的資料頁。

這就好比書庫中的書就是按照書名的拼音在排序,而且也只按照這一種排序方式建立相應的索引卡片,於是查詢起來要比上述只建立非聚集索引的方式要簡單得多。仍以上面的查詢為例:

假定在lastname欄位上建立了聚集索引,則執行select * from member where lastname=』ota』時,查詢過程是:①sqls查詢indid值為1,這是在系統中只建立了聚集索引的標誌;②立即從根出發,在非葉級節點中定位最接近ota的值「martin」,並查到其位於葉級頁面的第120頁;③在位於葉級頁面第120頁的martin下搜尋到ota條目,而這一條目已是資料記錄本身;④將該記錄返回客戶端。

這一次的效率比第二種方法更高,以致於看起來更美,然而它最大的優點也恰好是它最大的缺點——由於同一張表中同時只能按照一種順序排列,所以在任何一種資料表中的聚集索引只能建立乙個;並且建立聚集索引需要至少相當於源表120%的附加空間,以存放源表的副本和索引中間頁

(四)sqls怎樣訪問既有聚集索引、又有非聚集索引的資料表:

如果我們在建立非聚集索引之前先建立了聚集索引的話,那麼非聚集索引就可以使用聚集索引的關鍵字進行檢索,就像在圖書館中,前台卡片櫃中的可以有不同類別的圖書索引卡,然而每張卡片上都載明了那個特殊編號——並不是書籍存放的具體位置。這樣在最大程度上既照顧了資料檢索的快捷性,又使索引的日常維護變得更加可行,這是最為科學的檢索方法。

也就是說,在只建立了非聚集索引的情況下,每個葉級節點指明了記錄的行定位符(rid);而在既有聚集索引又有非聚集索引的情況下,每個葉級節點所指向的是該聚集索引的索引鍵值,即資料記錄本身。

假設聚集索引建立在lastname上,而非聚集索引建立在firstname上,當執行select * from member wherefirstname=』mike』時,查詢過程是:①sqls查詢indid值為2;②立即從根出發,在firstname的非聚集索引的非葉級節點中定位最接近mike的值「jose」條目;③從jose條目下的葉級頁面中查到mike邏輯位置——不是rid而是聚集索引的指標;④根據這一指標所指示位置,直接進入位於lastname的聚集索引中的葉級頁面中到達mike資料記錄本身;⑤將該記錄返回客戶端。

資料庫 資料庫索引

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

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

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

資料庫索引

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