資料庫的索引

2021-07-15 04:31:53 字數 1449 閱讀 4000

索引這個東西很抽象,今天就來**一下,它究竟是用來幹什麼的?它的原理又是什麼?

索引的英文是index,在mysql裡面建立索引的關鍵字是key

索引是對字段建立的,可以是乙個字段,可以是多個字段

對多個字段建立索引的時候,在第乙個字段相同時才按第二個欄位來排序,並以此類推。

假如我們要對name, country, age這3個字段建立乙個索引,語句為key(name, country, age)

1.資料在資料庫中的儲存

資料庫的儲存底層是檔案系統,檔案系統是按塊(chunk)來組織的。

資料庫查詢的主要消耗就是對於塊的讀取,可以用對塊的讀取次數來表示資料庫的讀取時間。

優化的目標其實就是在查詢的時候查到同樣的資料儘量減少對於塊的讀取。

2.什麼是索引

假設我們有m條記錄,每次讀取乙個塊,乙個塊可以存n條記錄。

那麼我們平均需要讀取二分之m/n次外存(這裡假設查詢的關鍵字是唯一的)。

現在我們想要進行二分查詢式的搜尋,以提高搜尋效率。

那我們應該怎麼辦呢?

將索引的字段,按照某個可比較的順序先排個序。

但是問題來了,二分查詢需要將所有的東西組織到乙個陣列或者一棵樹種,但是這都是要將所有資訊全部放進記憶體才行啊。

就算我們有辦法通過不斷更新記憶體值來對外提供乙個等價於外存大小的記憶體,但是這就是需要不斷讀取外存啊。

這不就是回到原點了嗎?我們最開始要達到的目的不就是要減少讀取外存塊的次數嗎!

這個時候我們就可以使用b樹(我這裡不區分b樹或者b+樹)來構建一種資料結構了。

所以借助引用我們可以每次通過二分查詢找到去到下一層的指標,所以每下降一層最多讀取一次外存塊。

所以查詢是對數級。

當然用二搜尋樹這樣做也能達到類似的效果。但是這裡節點的子節點可以有若干,這樣同樣的節點數,樹的高度更低。

畢竟樹的高度就是讀取外存的次數。而且b+樹把葉子節點串起來,很有利於範圍超找。

3.索引的優缺點

優點:①本身索引字段值+指標值相對於單條完整記錄值空間更小,所以同樣一次讀取外存塊,能夠訪問的條目更多。

②將線性搜尋線性複雜度借助於樹的結構轉變為n分查詢的對數複雜度。

當然②相對於①要重要地多。

缺點:①索引記錄本身是需要儲存空間的,如果你對很多字段分別建立索引,會消耗很多儲存空間。

畢竟對於某些比較小的字段乙個指標說不定比欄位本身還大,結果就是某個欄位的索引比某個字段還要打。

1.你知道資料庫索引的工作原理嗎?

2.《高效能mysql》

3.《大規模分布式儲存系統-原理解析與架構實戰》

資料庫 資料庫索引

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

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

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

資料庫的索引

索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資訊。索引提供指向儲存在表的指定列中的資料值的指標,然後根據您指定的排序順序對...