1. 程式人生 > >語言小知識-MySQL資料庫引擎

語言小知識-MySQL資料庫引擎

  MySQL作為全世界廣受歡迎的資料庫,被用於很多中小型的專案中,但是你對 MySQL 資料庫的儲存引擎瞭解多少呢?

  我們將邏輯表中的資料儲存到資料庫中,資料庫又將我們表中的資料儲存到物理裝置中(如磁碟,記憶體)。資料在物理裝置上如何儲存?如何建立索引?如何進行增刪該查操作?對資料在物理裝置上的儲存和操作方式(或者說是型別、服務)就稱為資料庫引擎。

  比如,在賽車比賽中,如果賽車手根據不同的比賽地形選擇合適的賽車引擎,就能夠讓賽車跑得更快。MySQL 資料庫支援插拔式的儲存引擎,可以很方便的更換不同的資料庫引擎,相比較而言,賽車手更換引擎就沒那麼方便了。MySQL 資料庫的邏輯架構圖如下,可以看到,儲存引擎在整個 MySQL 資料庫系統中位於底層。

  

 

  在 命令列中使用 show engines 檢視 MySQL 資料庫引擎,從下圖中可以看出當前 MySQL 預設的資料庫引擎就是 InnoDB。(我這裡的 MySQL 為社群版 5.7 版本,請自行忽略背景中的小姐姐,手動滑稽~。)

  

 

  下面我將一一介紹這些資料庫引擎。

  InnoDB 引擎:

  自從 MySQL5.6 後,InnoDB 就是 MySQL 預設的儲存引擎,在這之前是 MyISAM 引擎。

  InnoDB支援事務,支援外來鍵,支援自動的災難恢復,使用行鎖支援高併發的讀取,支援熱備份和奔潰後的快速恢復,支援全文檢索(5.6.4版本才支援,所以一些面試題由於時間原因可能這裡不嚴謹),有自己的讀寫快取管理機制,即快取索引也快取資料,不支援壓縮(未來可能支援)。

  使用 InnoDB 引擎建立表,會生成 frm 檔案和 idb 檔案,frm 檔案中儲存表的定義,idb 檔案中儲存表的資料和索引。

  

 

  一般來說,InnoDB 對於大多數情況都是很不錯的選擇,能滿足絕大多數的需要,這也是它稱為MySQL5.6 之後預設資料庫引擎的原因。

  MyISAM 引擎:

  MyISAM不支援事務,不支援奔潰後快速恢復,使用表鎖不適合高併發,追求效能,依賴作業系統管理讀取和寫入的快取,只快取索引不快取真實資料,支援壓縮。

  使用 MyISAM 引擎建立表,會生成 frm 檔案、MYD檔案和MYI檔案,frm 檔案中儲存表的定義,MYD 檔案中儲存表的資料,MYI檔案中儲存表的索引。

  

 

  因為 MyISAM 引擎不支援事務處理,所以意味著有事務需求時,不能使用 MyISAM 儲存引擎。MyISAM 追求的是效能,適合插入和讀取操作。

  MRG_MyISAM (MERGE)引擎:

  MRG_MyISAM引擎是一組 MyISAM 表的組合,在MySQL5.7 之前叫做 MEGER。

  使用 MEG_MyISAM 引擎建立表,會生成 frm 檔案和 MRG 檔案,frm 檔案中儲存表的定義,MEG 檔案儲存表的資料。

  MEG_MyISAM引擎需要主表 MERGE 和子表具有完全一樣的資料結構(屬性、資料型別、索引)。對於儲存策略是分成多表,如日誌表,按照一年十二個月份劃分,需要 12 張定義完全一樣的資料表。當聯合多個月份的表查詢資料時,需要寫多個表的連線,這時使用 MEG_MyISAM 引擎只需要像對待一張表一樣查詢,對資料的操作就變得簡單了。

  MEMORY 引擎:

  MEMEORY速度快,資料直接儲存在記憶體中。

  使用 MEMORY 引擎建立表,只會生成 frm 檔案,因為表的資料是暫時存放在記憶體中的。

  MEMORY追求的是速度,為了得到更快的響應時間,採用速度相對磁碟快得多的記憶體做為儲存介質,可以作為臨時表使用。但由於資料是放在記憶體中的,表中的資料需要立即使用,否則當 MySQL守護程序奔潰時,表中的資料就會丟失。

  CSV 引擎:

  使用 CSV 引擎建立表,會生成 frm 檔案,CSV 檔案和CSM檔案,frm 檔案中儲存表的定義,CSV 檔案中儲存表的資料,CSM 檔案中儲存表的元資訊(如資料表現在的狀態,資料表中的資料數量)。

  生成的資料檔案可直接使用 Office 中的 Excel 開啟,但要注意檔案損壞,必要時可使用命令 check table、repair table 檢查和恢復表。

  BLACKHOLE 引擎:

  BLACKHOLE如同它的名字,插入任何資料都不會儲存,表永遠為空,寫入任何資料都會消失,就像是黑洞一樣,可以吃掉所有的資料。

  使用 BLACKHOME 引擎建立表,只會生成 frm 檔案,frm 檔案中儲存表的定義,因為寫入任何資料都不會儲存,所以也就沒有儲存表資料的檔案。

  BLACKHOLE不會儲存資料,所以資料表可以作為演示使用,隨意的增刪改查,最終都不會在表中留下資料。

  PERFORMANCE_SCHEMA 引擎:

  該引擎用於收集資料庫效能相關的引數,是 MySQL 的效能模式,主要關注效能資料。使用者不能直接建立儲存引擎為PERFORMANCE_SCHEMA 的表。

  ARCHIVE 引擎:

  ARICHIVE支援資料壓縮,支援插入和查詢操作兩種功能。

  使用 ARCHIVE 引擎建立表,會生成 frm 檔案和 ARZ 檔案,frm 檔案中儲存表的定義,ARZ 檔案中儲存表的壓縮後的資料和索引。

  FEDERATED 引擎:

  支援代理查詢,即建立一個遠端的 MySQL客戶端連線,將要查詢的語句傳輸到遠端伺服器上執行,完成資料的存取。

  從上圖中可以看到,社群版的 MySQL 並不支援 FEDERATED 引擎。

  除了上面這些資料庫引擎,你還可以使用自己開發的資料庫引擎,MySQL 提供了很好的擴充套件性。

  根據自己的需要使用資料庫引擎,才能發揮出資料庫的效能和滿足實際的需要。在選擇 MySQL 資料庫引擎之前,你要考慮下面幾個問題。

  ·1、是否需要支援事務?

  ·2、是否需要熱備份?

  ·3、是否需要奔潰恢復?

  ·4、是否需要外來鍵支援?

  ·5、儲存的限制?

  ·6、對索引和快取的支援?

  這裡也提供一張各種引擎對照表供你檢視,一般來說 InnoDB 是個萬金油式的選擇,InnoDB 和 MyISAM 引擎最常用。