Mysql-索引數據結構&引擎篇

Mysql能夠說是最普遍使用的數據庫之一了,體積小,成本低,開源(免費纔是王道呀-。-),本文旨在和你們一塊兒探索Mysql的一些相關知識,不只要會用它來寫sql,更要學習它的底層設計和技術延伸。mysql

索引數據結構

Mysql索引是基於B+tree的數據結構來設計的,那麼爲何不使用二叉樹,Hash(實際上是支持的),B-tree等結構來設計索引呢?sql

二叉樹:

樹的層數太高,容易退化成鏈表數據庫

平衡二叉樹,紅黑樹:

層數仍然太高,會大大增長系統的IO頻率緩存

Hash

Mysql是支持Hash索引的,只不過Hash索引不支持範圍查找,而咱們在平常工做中須要普遍的運用到範圍查詢數據結構

B-tree:

1.在B-tree和B+tree中,每個節點叫作一個磁盤頁,每個磁盤頁的大小是16K,那麼相比較於B-tree是在每一個節點上都存儲數據,B+tree是隻在葉子節點上存儲數據,相同層數下,B+tree能存儲的數據量要大於B-tree
2.B+tree的葉子節點有雙向指針,對於範圍查找的效率能大大提高併發

存儲引擎

Mysql中有不少種存儲引擎,咱們這裏主要介紹的是MyISAMInnoDB學習

打開不一樣引擎的表的存儲文件夾,會發現這兩種引擎用來保存相關數據的文件不一樣:
MyISAM設計

.frm文件:存儲表結構
.MYD文件:存儲數據
.MYI文件:存儲索引
查詢時,若是有索引,在MYI文件中根據索引獲取數據地址,再去MYD文件中查找到數據

InnoDB指針

.frm文件:存儲表結構
.ibd文件:存儲索引和數據
索引和數據都存儲在ibd文件

除了存儲文件上的區別,MyISAM和InnoDB還有如下的區別:索引

  • 前者是非彙集索引,後者是彙集索引
  • 前者不支持事務,後者支持
  • 前者不支持外鍵,後者支持
  • 前者只支持表鎖,後者支持表鎖和行鎖
  • 前者保存表的行數,後者每次僅限count(*)操做須要去掃描全表
  • delete表的時候,前者是從新建表,後者是一行行的刪
    ···

那麼,何時使用哪一個最好呢?通常來講,系統業務涉及到查詢佔大部分,對事務需求度低,容忍度高的,能夠使用MyISAM引擎,MyISAM查詢效率要高於InnoDB。反之,系統涉及併發量大,須要大量的增刪改操做,建議使用InnoDB引擎。

tips:MyISAM查詢效率更高,是由於:InnoDB要緩存數據塊,而MyISAM只要緩存索引塊;在select的時候InnoDB須要去維護MVCC(多版本併發控制);InnoDB查詢須要映射到塊再到行,而MyISAM直接記錄文件的offset,定位更快

彙集索引和非彙集索引

  • 對於主鍵索引和非主鍵索引來講,MyISAM節點的主鍵索引和非主鍵索引都存放的是行數據的磁盤地址InnoDB非主鍵索引存儲的是主鍵值,而主鍵索引裏存儲的是行數據,當進行非主鍵索引查詢時,先在非主鍵索引中查找到對應的主鍵值,而後根據主鍵值再去主鍵索引裏進行一次樹查詢,獲取主鍵索引中存儲的行數據。(這種第一次樹查詢定位主鍵,第二次再進行一次樹查詢的操做叫作回表
  • 根據索引存儲方式的不一樣,咱們把MyISAM的主鍵索引和非主鍵索引類型叫作非彙集索引,把InnoDB的主鍵索引類型叫作彙集索引,非主鍵索引類型叫作輔助索引(普通索引)。彙集的含義能夠理解爲索引和數據聚合在一塊兒。
使用InnoDB時的tips:
1.基於上面的設計,InnoDB必須設置主鍵索引,因此通常建議咱們在進行表的設計的時候都要添加主鍵列,若是不設置主鍵,mysql會在表中尋找一個惟一列來當作主鍵索引,若是沒有這樣的列,它會去維護一個虛擬列,用以創建主鍵索引
2.主鍵儘量的要設置成自增整型類型,由於最終在B+tree中是須要去比較索引大小的,若是是非整型的,或者是無序的主鍵,還須要先去進行值轉換,無疑增長了額外時間開支
相關文章
相關標籤/搜索