資料庫索引 引入

2021-09-05 11:49:32 字數 2143 閱讀 8104

資料庫索引的通俗理解

為什麼需要索引?

「索引就像書的目錄,通過書的目錄就準確的定位到了書籍具體的內容」,

資料在磁碟上是以塊的形式儲存的。為確保對磁碟操作的原子性,訪問資料的時候會一併訪問所有資料塊。磁碟上的這些資料塊與鍊錶類似,即它們都包含乙個資料段和乙個指標,指標指向下乙個節點(資料塊)的記憶體位址,而且它們都不需要連續儲存(即邏輯上相鄰的資料塊在物理上可以相隔很遠)。

舉個例子來講,我們有乙個資料表user.為了簡便,這個表沒有主鍵。

identity

name

agegrade

robin

lilei

hanmei

lucy

lily

雖然這些資料都存在於乙個user表中,但是物理上,這些資料可能儲存在分散的資料塊中。

查詢lily這個人的資訊, 已知lily的identity為2, select* fromuser where identity= 2.

在查詢的時候,首先找到這個表的第一條記錄所在的資料庫位址,然後發現identity為1,並不是所需要的值,然後在這個資料庫的底端,找到了下乙個資料塊的位址。(這個類似於鍊錶),如此一來,查詢了5次才找到了所需要的值。(為了簡單起見,我們考慮identity不能有重複值)

為了加快搜尋速度,這裡就出現了索引。索引是對某個字段進行排序的一種方式。對錶中的某個字段建立索引會建立另一種資料結構,其中儲存著字段的值,每個值又指向與它相關的記錄。這種索引的資料結構是經過排序的,因而可以對其執行二分查詢。

對上個表的identity欄位進行索引,就是在資料庫儲存空間上建立一塊專用的控制項,把user表的所有的identity欄位的值拿出來放到這裡,並且對這些值進行排序,並且每個值都攜帶著這個identity對應的行所在資料塊的位址。因為identity是進過排序的,按照一定的資料結構儲存的,所以資料庫引擎在查詢的時候,比如說查詢identity為5,引擎就會計算,5大概在整個排序結構的大致地方,然後到那裡去拿出這個值看看是不是,不是的話就再次相應的向左或者向右移動去尋找。(這裡用到的知識都是大學時候的資料結構的知識,二分法查詢,相對於毫無頭緒的乙個乙個的查詢,二分法的查詢速度明顯的提高,達到了log2 n,其實這有多快我也不明白,反正就記得當時學的時候,確實是比一般查詢快多了。)

通俗的來講,就是根據你指定的列,建立乙個遵循一定資料結構的區域,這些區域可以快速定位到相應資料庫字段所在的磁碟位址

索引的好處是特別明顯的,那就是大大的提高了查詢的速度。但是相對應的也帶來了一些不好的地方。

第一,建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。

第二,索引需要佔物理空間,除了資料表佔資料空間之外,每乙個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。

第三,當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。

最後還有一點需要注意的是,我們在資料庫上對於某個字段建立了索引,那麼什麼情況下才走索引呢?

比如 select * from user where identity= 2 這條語句,是走索引查詢的。因為是否走索引取決於這條查詢語句的where子句。資料庫引擎發現你的where語句中有identity,那麼就會從identity的索引資料結構中進行檢索。曾經看到有人說select *會降低檢索速度,這個跟索引沒關係,select * 降低檢索速度,是因為從資料庫伺服器端到客戶端的網路傳輸是有時間的,select * 中難免包含著不必要的字段,所以傳輸起來會比較慢

上述講到了儲存索引用的是某種資料結構型別,接下來將說一下具體索引的儲存用到了什麼資料結構的型別:

索引原理必須清楚一種資料結構「平衡樹」(非二叉),也就是b tree或者 b+tree,重要的事情說三遍:「平衡樹,平衡樹,平衡樹」。當然,有的資料庫也使用雜湊桶作用索引的資料結構,然而,主流的rdbms都是把平衡樹當做資料表預設的索引資料結構的。

下一節詳細講解索引的底層資料結構 

資料庫索引入門學習

我的理解 書的目錄,根據目錄對應的頁碼可以迅速找到對應章節 但是具體原理並不是這麼簡單 b tree平衡樹是資料表預設的索引資料結構,建立表的時候必須設定主鍵,主鍵就會把表在磁碟上的儲存結構由整齊排列變成樹狀結構,也就是整個表,變成了乙個索引,也就是聚集索引。1.唯一索引 不允許任何兩列具有相同索引...

資料庫 資料庫索引

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

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

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