mysql 作為全世界廣受歡迎的資料庫,被用於很多中小型的專案中,但是你對 mysql 資料庫的儲存引擎了解多少呢?
我們將邏輯表中的資料儲存到資料庫中,資料庫又將我們表中的資料儲存到物理裝置中(如磁碟,記憶體)。資料在物理裝置上如何儲存?如何建立索引?如何進行增刪該查操作?對資料在物理裝置上的儲存和操作方式(或者說是型別、服務)就稱為資料庫引擎。
比如,在賽車比賽中,如果賽車手根據不同的比賽地形選擇合適的賽車引擎,就能夠讓賽車跑得更快。mysql 資料庫支援插拔式的儲存引擎,可以很方便的更換不同的資料庫引擎,相比較而言,賽車手更換引擎就沒那麼方便了。mysql 資料庫的邏輯架構圖如下,可以看到,儲存引擎在整個 mysql 資料庫系統中位於底層。
mysql邏輯架構圖.png
在 命令列中使用 show engines 檢視 mysql 資料庫引擎,從下圖中可以看出當前 mysql 預設的資料庫引擎就是 innodb。(我這裡的 mysql 為社群版 5.7 版本,請自行忽略背景中的小姐姐,手動滑稽~。)
檢視mysql包含的資料庫引擎.png
下面我將一一介紹這些資料庫引擎。
innodb 引擎:
自從 mysql5.6 後,innodb 就是 mysql 預設的儲存引擎,在這之前是 myisam 引擎。
innodb 支援事務,支援外來鍵,支援自動的災難恢復,使用行鎖支援高併發的讀取,支援熱備份和奔潰後的快速恢復,支援全文檢索(5.6.4版本才支援,所以一些面試題由於時間原因可能這裡不嚴謹),有自己的讀寫快取管理機制,即快取索引也快取資料,不支援壓縮(未來可能支援)。
使用 innodb 引擎建立表,會生成 frm 檔案和 idb 檔案,frm 檔案中儲存表的定義,idb 檔案中儲存表的資料和索引。
innodb引擎.png
一般來說,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 資料庫引擎之前,你要考慮下面幾個問題。
這裡也提供一張各種引擎對照表供你檢視,一般來說 innodb 是個萬金油式的選擇,innodb 和 myisam 引擎最常用。
各種引擎比較.png
語言小知識 MySQL資料庫引擎
mysql作為全世界廣受歡迎的資料庫,被用於很多中小型的專案中,但是你對 mysql 資料庫的儲存引擎了解多少呢?我們將邏輯表中的資料儲存到資料庫中,資料庫又將我們表中的資料儲存到物理裝置中 如磁碟,記憶體 資料在物理裝置上如何儲存?如何建立索引?如何進行增刪該查操作?對資料在物理裝置上的儲存和操作...
語言小知識 MySQL資料庫引擎
mysql 作為全世界廣受歡迎的資料庫,被用於很多中小型的專案中,但是你對 mysql 資料庫的儲存引擎了解多少呢?我們將邏輯表中的資料儲存到資料庫中,資料庫又將我們表中的資料儲存到物理裝置中 如磁碟,記憶體 資料在物理裝置上如何儲存?如何建立索引?如何進行增刪該查操作?對資料在物理裝置上的儲存和操...
mysql資料庫小知識
本題考察mysql中的儲存引擎了解情況,innodb儲存引擎提供了具有提交 回滾和崩潰恢復能力的事務安全,但不支援全文索引。故c答案正確。本題是對mysql中字符集相關知識的考查。a選項錯誤,該系統變數為當前資料庫的預設字符集,下列為字符集相關系統變數 character set server 預設...