mysql索引小知識

哎呀, 很久都沒更新文章了,密碼都要忘了...

之後儘可能努力要隔兩天發一篇平常騷擾文。mysql

咱們常見的結構能夠作數據庫索引結構嘛

1. 哈希

哈希表這種結構適用於只有等值查詢的場景. 對於區間類查詢將會悲劇。sql

2. 有序數組

有序數組在等值查詢和範圍查詢場景中的性能就都很是優秀 , 可是若是插入 刪除操做成本高,適合數據不變化或只新增.數據庫

3 .樹類結構之 二叉樹

搜索效率最高,可是相應樹的高度高。致使讀磁盤數據塊次數多,下降性能數組

從下降磁盤次數提升性能優化可使用以下操做: 下降樹的高度, 造成n叉樹, 父節點能夠所有緩存到內存。緩存

innodb的默認索引結構

咱們mysql數據庫常用的爲 b+ 樹, 每個索引對應一個 b+ 樹。性能優化

B+樹每一個節點能夠有多個值, 這樣能夠下降樹的高度,有效減小磁盤的讀取次數. 全部葉子節點擁有鏈指針,對於區間查詢更加方便快速。網絡

按存儲形式區分索引

主鍵索引的葉子節點存的是整行數據。在 InnoDB 裏,主鍵索引也被稱爲聚簇索引 (clustered index)性能

非主鍵索引的葉子節點內容是主鍵的值。在 InnoDB 裏,非主鍵索引也被稱爲二級索引 (secondary index)優化

基於主鍵索引和基於普通索引區別

基於主鍵索引只須要掃描一次樹便可, 而基於普通索引掃描到主鍵, 再回表掃描主鍵索引。.net

回表的意思這裏表示查詢一次樹,再根據主鍵掃面主鍵B+索引。

(圖片來源網絡)

B+樹的索引維護

固然也有問題, 當你插入、刪除的大量節點數據爲無序型數據時, 會形成頻繁的頁分裂、索引維護問題, 產生空間碎片, 可能會致使性能降低。

因此爲何咱們儘可能採用主鍵爲整型的遞增順序呢?

1. 頁分裂

若是葉子節點保存了 200 400 500,此時插入300,會將400 500空出以前的位置,加入300。

若是此時此數據頁已滿, 則根據b+樹, 會從新申請數據頁, 此爲頁分裂。

2. 頁合併

固然有分裂就有合併。當相鄰兩個頁因爲刪除了數據,利用率很低以後,會將數據頁作合併。合併的過程,能夠認爲是分裂過程的逆過程。

3. 選擇主鍵的講究

顯然,主鍵長度越小,普通索引的葉子節點就越小,普通索引佔用的空間也就越小。因此咱們通常推薦 int(4字節) 或 bigint(8字節) 來做爲主鍵,佔用空間最小, 而且有序。

一樣下降索引的大小對於基於此索引的 B+ 樹掃描,一樣有益。

參考B B+ B- 樹介紹鏈接+圖例: blog.csdn.net/u013411246/…

相關文章
相關標籤/搜索