Mysql能夠說是最普遍使用的數據庫之一了,體積小,成本低,開源(免費纔是王道呀-。-),本文旨在和你們一塊兒探索Mysql的一些相關知識,不只要會用它來寫sql,更要學習它的底層設計和技術延伸。mysql
Mysql索引是基於B+tree的數據結構來設計的,那麼爲何不使用二叉樹,Hash(實際上是支持的),B-tree等結構來設計索引呢?sql
樹的層數太高,容易退化成鏈表數據庫
層數仍然太高,會大大增長系統的IO頻率緩存
Mysql是支持Hash索引的,只不過Hash索引不支持範圍查找,而咱們在平常工做中須要普遍的運用到範圍查詢數據結構
1.在B-tree和B+tree中,每個節點叫作一個磁盤頁,每個磁盤頁的大小是16K,那麼相比較於B-tree是在每一個節點上都存儲數據,B+tree是隻在葉子節點上存儲數據,相同層數下,B+tree能存儲的數據量要大於B-tree
2.B+tree的葉子節點有雙向指針,對於範圍查找的效率能大大提高併發
Mysql中有不少種存儲引擎,咱們這裏主要介紹的是MyISAM和InnoDB。學習
打開不一樣引擎的表的存儲文件夾,會發現這兩種引擎用來保存相關數據的文件不一樣:
MyISAM設計
.frm文件:存儲表結構
.MYD文件:存儲數據
.MYI文件:存儲索引
查詢時,若是有索引,在MYI文件中根據索引獲取數據地址,再去MYD文件中查找到數據
InnoDB指針
.frm文件:存儲表結構
.ibd文件:存儲索引和數據
索引和數據都存儲在ibd文件
除了存儲文件上的區別,MyISAM和InnoDB還有如下的區別:索引
那麼,何時使用哪一個最好呢?通常來講,系統業務涉及到查詢佔大部分,對事務需求度低,容忍度高的,能夠使用MyISAM引擎,MyISAM查詢效率要高於InnoDB。反之,系統涉及併發量大,須要大量的增刪改操做,建議使用InnoDB引擎。
tips:MyISAM查詢效率更高,是由於:InnoDB要緩存數據塊,而MyISAM只要緩存索引塊;在select的時候InnoDB須要去維護MVCC(多版本併發控制);InnoDB查詢須要映射到塊再到行,而MyISAM直接記錄文件的offset,定位更快
使用InnoDB時的tips:
1.基於上面的設計,InnoDB必須設置主鍵索引,因此通常建議咱們在進行表的設計的時候都要添加主鍵列,若是不設置主鍵,mysql會在表中尋找一個惟一列來當作主鍵索引,若是沒有這樣的列,它會去維護一個虛擬列,用以創建主鍵索引
2.主鍵儘量的要設置成自增整型類型,由於最終在B+tree中是須要去比較索引大小的,若是是非整型的,或者是無序的主鍵,還須要先去進行值轉換,無疑增長了額外時間開支