MySQL索引深刻理解底層數據結構

定義:索引是幫助MYSQL高效排好序的數據結構數據庫


索引存儲在文件裏
形式:二叉樹 HASH BTREE
爲何用BTREE而不用二叉樹:數據結構

clipboard.png
若是每次的數據都是以1,2,3,4,5,6的形式添加,會形成二叉樹單邊增加,從而致使查詢效率依然低下
紅黑樹會本身旋轉,會有一個自平衡的過程,可是高度是不可控的,(height),若是是百萬級別的數據,高度是徹底不可控的spa

爲何用BTREE而不用HASH:HASH若是是單個查找條件會比較快,好比col=3,直接用hash(index=3)便可,可是範圍查找的話效率很慢,大部分公司有不少業務都會是範圍查找設計

clipboard.png


若是讓你來設計MySQL的BTREE,你以爲degree設爲多少合適?
設爲磁盤I/O一個節點的值,假如一次I/O最多取4k,就設爲4k,做均衡
B+TREE的優點:非葉子節點不存儲數據,只存儲key
clipboard.png
評價一個索引結構好壞的標準:磁盤I/O次數
預讀:磁盤通常會順序向後讀取必定長度的數據(頁的整倍數)放入內存
局部性原理:若是一個數據被用到了,那他附近的數據也立刻會被用到
B+TREE的度通常會超過100,因此高度h會很是小(通常在3-5之間)
MyISAM索引實現:MyISAM索引文件和數據文件是分離的 存儲引擎是表級別,不是數據庫級別索引

clipboard.png
D-->Data I-->index
InnoDB-->彙集索引-->數據和索引是放在一塊兒的-->是按主鍵索引構建的一個BTREE樹
InnoDB-->推薦使用整型自增主鍵-->保證數據能夠順序插入到當前索引節點的後續位置,若是是用UUID,須要比較ASCII碼,還有可能插入的地方空間不足須要分裂開,花費更多的時間
不建議使用過長的字段做爲主鍵,由於全部輔助索引都引用主索引,過長的主索引會令輔助索引變得過大
爲何非主鍵索引結構葉子節點存儲的是主鍵值?(一致性和節省存儲空間)ip

相關文章
相關標籤/搜索