索引
什麼是索引
幫助數據庫高效獲取數據的數據結構
索引能幹什麼?
當表中數據量越來越大時,索引可以明顯提高查詢效率,當然索引並不是越多越好
索引的分類
MySql中索引默認結構爲B+樹,爲什麼不是B樹、Hash,二叉樹,紅黑樹?
- B樹:因爲其不管是葉子節點還是非葉子節點都會保存數據,這樣導致在非葉子節點中能保存的指針數量變少,指針少的情況下要保存大量的數據,只能增加樹的高度,導致IO操作變多,查詢性能變低
- Hash:雖然可以快速定位但是沒有順序,IO複雜度高
- 二叉樹:樹的高度不均勻,不能自平衡,查找和樹的高度有關,並且IO代價高
- 紅黑樹:樹的高度隨着數據量的增加而增加,IO代價高
總結
- MySQL使用B+Tree作爲索引數據結構。
- B+Tree在新增數據時,會根據索引指定列的值對舊的B+Tree做調整。
- 從物理存儲結構.上說,B-Tree 和B+Tree都以頁(4K)來劃分節點的大小,但是由於B+Tree中中間節點不存儲數據,因此B+Tree能夠在同樣大小的節點中,存儲更多的key,提高查找效率。
- 影響MySQL查找性能的主要還是磁盤I0次數,大部分是磁頭移動到指定磁道的時間花費。
- MyISAM存儲引擎下索引和數據存儲是分離的,InnoDB 索引和數據存儲在一起。
- InnoDB 存儲引擎下索引的實現,(輔助索引)全部是依賴於主索引建立的(輔助索引中葉子結點存儲的並不是數據的地址,還是主索引的值,因此,所有依賴於輔助索引的都是先根據輔助索引查到主索引,再根據主索引查數據的地址)。
- 由於InnoDB索引的特性,因此如果主索引不是自增的(id作主鍵),那麼每次插入新的數據,都很可能對B+Tree的主索引進行重整,影響性能。因此,儘量以自增id作爲InnoDB的主索引。