之後儘可能努力要隔兩天發一篇平常騷擾文。mysql
哈希表這種結構適用於只有等值查詢的場景. 對於區間類查詢將會悲劇。sql
有序數組在等值查詢和範圍查詢場景中的性能就都很是優秀 , 可是若是插入 刪除操做成本高,適合數據不變化或只新增.數據庫
搜索效率最高,可是相應樹的高度高。致使讀磁盤數據塊次數多,下降性能數組
從下降磁盤次數提升性能優化可使用以下操做: 下降樹的高度, 造成n叉樹, 父節點能夠所有緩存到內存。緩存
咱們mysql數據庫常用的爲 b+ 樹, 每個索引對應一個 b+ 樹。性能優化
B+樹每一個節點能夠有多個值, 這樣能夠下降樹的高度,有效減小磁盤的讀取次數. 全部葉子節點擁有鏈指針,對於區間查詢更加方便快速。網絡
主鍵索引的葉子節點存的是整行數據。在 InnoDB 裏,主鍵索引也被稱爲聚簇索引 (clustered index)性能
非主鍵索引的葉子節點內容是主鍵的值。在 InnoDB 裏,非主鍵索引也被稱爲二級索引 (secondary index)優化
基於主鍵索引只須要掃描一次樹便可, 而基於普通索引掃描到主鍵, 再回表掃描主鍵索引。.net
回表的意思這裏表示查詢一次樹,再根據主鍵掃面主鍵B+索引。
(圖片來源網絡)固然也有問題, 當你插入、刪除的大量節點數據爲無序型數據時, 會形成頻繁的頁分裂、索引維護問題, 產生空間碎片, 可能會致使性能降低。
因此爲何咱們儘可能採用主鍵爲整型的遞增順序呢?
若是葉子節點保存了 200 400 500,此時插入300,會將400 500空出以前的位置,加入300。
若是此時此數據頁已滿, 則根據b+樹, 會從新申請數據頁, 此爲頁分裂。
固然有分裂就有合併。當相鄰兩個頁因爲刪除了數據,利用率很低以後,會將數據頁作合併。合併的過程,能夠認爲是分裂過程的逆過程。
顯然,主鍵長度越小,普通索引的葉子節點就越小,普通索引佔用的空間也就越小。因此咱們通常推薦 int(4字節) 或 bigint(8字節) 來做爲主鍵,佔用空間最小, 而且有序。
一樣下降索引的大小對於基於此索引的 B+ 樹掃描,一樣有益。