您的位置:首頁>正文

「面試題」MySQL幾種常用的存儲引擎及其區別?

問題

說一說MySQL幾種常用的存儲引擎?

它們的區別是什麼?

解析

前言

存儲引擎(Storage Engine)就是指表的類型以及表在電腦上的存儲方式。

存儲引擎的概念是MySQL的特點, 提供了存儲引擎介面, 有興趣的開發者可以編寫自己的存儲引擎。 Oracle、SQL Server面試的時候不會問到存儲引擎, 所以這裡不再敘述。

存儲引擎查看

在mysql用戶端中, 使用以下命令可以查看MySQL支援的引擎:

mysql> show engines;

InnoDB存儲引擎

在MySQL從3.23.34a開始包含InnoDB。 有以下特點:

它遵循ACID模式設計, 提供了具有提交、回滾和崩潰恢復能力的事務安全。

為了維護資料完整性, InnoDB還支援外鍵完整性約束。

支持自動增加列AUTO_INCREMENT(自動增長列)屬性。

InnoDB 提供行級鎖, 大幅度提高了多使用者併發操作的性能。

總結:InnoDB的優勢在於提供了良好的交易處理、崩潰修復能力和併發控制。 缺點是讀寫效率較差, 佔用的資料空間相對較大。 使用場景, 如:銀行(對事務的完整性要求比較高), 售票(要求實現併發控制)。

MyISAM存儲引擎

MyISAM基於ISAM存儲引擎, 並對其進行擴展。 MyISAM擁有較高的插入、查詢速度, 但不支援事物。 曾經是MySQL的預設存儲引擎。

MyISAM的表存儲成3個檔。 文件的名字與表名相同。 檔案類型:檔存儲表定義的副檔名為.frm、資料檔案的副檔名為.MYD(MYData)、索引檔的副檔名時.MYI(MYIndex)。

基於MyISAM存儲引擎的表支援3種不同的存儲格式。 包括靜態型、動態型和壓縮型。 其中, 靜態型是MyISAM的預設存儲格式, 它的欄位是固定長度的;動態型包含變長欄位,

記錄的長度不是固定的;壓縮型需要用到myisampack工具, 佔用的磁碟空間較小。

總結:MyISAM的優勢在於佔用空間小, 處理速度快。 缺點是不支援事務的完整性和併發性。

MEMORY存儲引擎

MEMORY是MySQL中一類特殊的存儲引擎。 它使用存儲在記憶體中的內容來創建表, 而且資料全部放在記憶體中。

資料存儲在記憶體中, 這樣有利於快速處理, 提高整個表的效率。 這就要求, 伺服器需要有足夠的記憶體來維持MEMORY存儲引擎的表的使用。 如果不需要了, 可以釋放記憶體, 甚至刪除不需要的表。

總結:MEMORY用到的很少, 因為它是把資料存到記憶體中, 如果重啟或者關機, 所有資料都會消失。

Archive存儲引擎

用於資料歸檔, 壓縮比非常高, 存儲空間大概是innodb的10-15分之一。

所以它用來存儲歷史資料非常適合, 如記錄日誌資訊。 archive存儲引擎支援insert、replace和select操作, 但是不支持update和delete, 不支援事務, 其設計目標只是提供高速的插入和壓縮功能。

MERGE存儲引擎

MERGE存儲引擎, 也被認識為MRG_MyISAM引擎, 是一組MyISAM表的組合, 這些MyISAM表結構必須完全相同。

舉個例子:

我們現在要記錄使用者登錄和操作的日誌, 假設這裡使用MyISAM引擎建表。 為了防止歷史資料積累, 使表過大。 一般的做法是將資料分成很多表, 每個名稱與特定的時間相關。 比如`t_log_201801`,`t_log_201802`。

假設`t_log_201801`表有以下資料:

`t_log_201801`表

假設`t_log_201802`表有以下資料:

`t_log_201802`表

如果我們要查Tom的登錄情況, 可以用join聯立多張表。 也可以用MERGE存儲引擎將這些表合併成一張“虛擬表”。

CREATE TABLE IF NOT EXISTS `u_log` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`log` varchar(50) DEFAULT NULL,

`username` varchar(50) DEFAULT NULL,

INDEX(id)

) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 UNION=(t_log_201801,t_log_201802)

查詢`u_log`後, 得:

`u_log`表

總結:主要用於合併查詢多張結構相同的表。

附錄

如何指定表使用某種存儲引擎?

CREATE TABLE IF NOT EXISTS `t_test` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`log` varchar(50) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM;

後面跟ENGINE=MyISAM, 即可指定使用MyISAM存儲引擎, 以此類推。

2.如何查看表使用了某種存儲引擎?

show create table `t_test`; --`t_test`為表名

3.如何修改表使用的存儲引擎?

alter table `t_test` engine=MyISAM; --`t_test`為表名

4.附上表格:

原創作品, 本系列為面試題

關注小編, 後續會推出更多面試系列作品

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示