MySQL實戰筆記(四)資料庫索引

2021-10-05 14:03:52 字數 2163 閱讀 1353

索引的出現其實就是為了提高資料查詢的效率你,就像書的目錄一樣。一本500頁的書,如果你想找到其中的某個知識點,在沒有目錄的情況下,需要找好久。同樣,對於資料庫的表而言,索引其實就是它的目錄。

索引的出現是為了提高查詢效率,但是實現索引的方式和資料結構有多種,先學習其中的三種,它們分別是雜湊表、有序陣列和搜尋樹。

從使用者的角度簡要分析一下這三種模型的區別。

雜湊表是一種以鍵-值(key-value)儲存資料的結構,我們只要輸入待查詢的值即key,就可以找到其對應的值即value.雜湊的思路很簡單,把值放在陣列裡,用乙個雜湊函式把key換算成乙個確定的位置,然後把value放在陣列的這個位置。

不可避免地,多個 key 值經過雜湊函式的換算,會出現同乙個值的情況。處理這種情況的一種方

法是,拉出乙個鍊錶。

缺點:新增快,但是使用雜湊索引做區間查詢速度很慢。

所以,雜湊表這種結構只適用於等值查詢的場景。

有序陣列在等值查詢和範圍查詢場景中的效能都非常優秀。

可以使用二分發查詢其中的資料,但是插入乙個記錄必須移動後面所有的記錄,成本太高,所以

有序陣列索引只適用於靜態儲存引擎。比如2023年某市人口資訊,這類不會再修改的資料。

二叉搜尋樹:平衡二叉樹   o(log(n))複雜度

樹可以二叉,也可以多叉。二叉搜尋樹是搜尋效率最高的,但是實際上大多數的資料庫儲存不使用二叉樹,原因是索引不止存在記憶體中,還要寫到磁碟上。

在機械硬碟時代,從磁碟隨機讀乙個資料塊需要10ms左右的定址空間。如果有一顆100萬節點的平衡二叉樹,樹高20層,,一次查詢可能訪問20個資料塊,單獨訪問乙個記錄可能需要20*10ms的時間。

為了讓乙個查詢盡量少地讀磁碟,就必須讓查詢過程訪問盡量少的資料塊。那麼,我們就不應該

使用二叉樹,而是要使用 「n 叉 」 樹。這裡, 「n 叉 」 樹中的 「n」 取決於資料的多少。

以 innodb 的乙個整數字段索引為例,這個 n 差不多是 1200 。這棵樹高是 4 的時候,就可以存

1200 的 3 次方個值,這已經 17 億了。考慮到樹根的資料塊總是在記憶體中的,乙個 10 億行的表上一

個整數欄位的索引,查詢乙個值最多隻需要訪問 3 次磁碟。其實,樹的第二層也有很大概率在內

存中,那麼訪問磁碟的平均次數就更少了。

n 叉樹由於在讀寫上的效能優點,以及適配磁碟的訪問模式,已經被廣泛應用在資料庫引擎中

了。在innodb中,表都是根據主鍵順序以索引的形式存放的,這種儲存方式的表稱為索引組織表,innodb使用了b+樹索引模型,資料都是儲存在b+樹中的。

每乙個索引在 innodb 裡面對應一棵 b+ 樹。

假設,我們有乙個主鍵列為 id 的表,表中有字段 k ,並且在 k 上有索引。

建表語句為:

mysql> create table t(

id int primary key,

k int not null,

name varchar(16),

index (k))engine=innodb;

表中記錄r1~r5 的 (id,k) 值分別為 (100,1) 、 (200,2) 、 (300,3) 、 (500,5) 和 (600,6) ,兩棵樹的示例示意

圖如下。

根據葉子節點的內容,索引分為主鍵索引和非主鍵索引。

主鍵索引的葉子節點存的是整行資料。非主鍵索引的葉子節點內容是主鍵的值。

基於非主鍵索引的查詢需要多掃瞄一棵索引樹。因此,我們在應用中應該盡量使用主

鍵查詢。

索引維護

b+ 樹為了維護索引有序性,在插入新值的時候需要做必要的維護。

如果 r5 所在的資料頁已經滿了,根據 b+ 樹的演算法,這時候需要申請乙個新的

資料頁,然後挪動部分資料過去。這個過程稱為頁**。在這種情況下,效能自然會受影響。

除了效能外,頁**操作還影響資料頁的利用率。原本放在乙個頁的資料,現在分到兩個頁中,

整體空間利用率降低大約 50% 。

當然有**就有合併。當相鄰兩個頁由於刪除了資料,利用率很低之後,會將資料頁做合併。合

並的過程,可以認為是**過程的逆過程。

Mysql學習筆記(四)聊聊資料庫索引

小心情 可直接跳到分割線後 今天心情好些了。一些濃的化不開的壞情緒,也漸漸的在晚上解決掉乙個複雜的邏輯問題後,漸漸消散了。今天中午去吃飯的時候,坤哥漫不經心的說 我這麼多年終於悟出了乙個道理,人年輕的時候不要那麼拼命,都沒有時間做其他事情了 我問什麼其他事情,坤哥看了我一眼,又繼續漫不經心的說,那麼...

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

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

mysql更新索引庫 Mysql資料庫索引增刪改查

一.索引的作用 一般的應用系統,讀寫比例在10 1左右,而且插入操作和一般的更新操作很少出現效能問題,遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,所以查詢語句的優化顯然是重中之重。在資料量和訪問量不大的情況下,mysql訪問是非常快的,是否加索引對訪問影響不大。但是當資料量和訪問量劇增的...