MySQL 儲存引擎
儲存引擎
DBMS使用儲存引擎進行資料的建立、查詢、更新、刪除操作。
不同的儲存引擎提供不同的儲存機制、索引技巧、鎖定水平等功能,使用不同的儲存引擎還可以獲得特定的功能。
MySQL提供了多種儲存引擎,最常見的有3種。
1、MyISAM
MySQL5.5之前的預設的儲存引擎,每個MyISAM在磁碟上儲存成三個檔案,檔名和表名相同,副檔名分別是
(1)frm檔案:儲存表的定義
(2)MYD檔案:儲存表中的資料(記錄)
(3)MYI檔案:儲存索引。索引儲存的是資料檔案的指標
特點
- 訪問速度快(優)
- 支援全文索引(優)。但基本不使用MySQL的全文索引,全文索引一般都是使用第三方的ElasticSearch,Solr等更加成熟的解決方案。
- 不支援事務、外來鍵(缺)
- 預設的鎖粒度為表級鎖,所以併發度很差(缺),但加鎖快,鎖衝突較少,不容易發生死鎖(優);
- 對資料的查詢快取只快取索引,不快取資料(記錄),而且使用的是作業系統本身的快取。
- 自動增長列可以是組合主鍵中的任何一列。設定自動增長列:建立表時,在欄位後加auto_increment,預設初始值是1
適用場景
- 不需要事務
- 不使用外來鍵
- 操作以select、insert為主
MyISAM支援三種不同的儲存格式
(1)靜態表(fixed)
表中不能包含變長欄位(比如VARCHAR, BLOB, TEXT),每個記錄都是固定的長度。如果MyISAM表中沒有一個變長欄位,則預設使用靜態表。
優點:儲存迅速,出現故障容易恢復
缺點:佔用空間比動態表大。靜態表在進行資料儲存時會按照事先定義的列寬補足空格,但在訪問的時候會去掉補的空格
(2)動態表(dynamic)
可包含變長欄位(varchar、blob、text),如果一個MyISAM表包含任何可變長度的欄位,或者該表建立時用row_format=dynamic指定,則該表使用動態格式儲存
優點:佔用空間小
缺點:頻繁的更新、刪除操作會產生碎片,需要定期用optimize table語句或myisamchk -r命令來改善效能,出現故障後較難恢復
(3)壓縮表
由myisampack工具建立,每條記錄都會被單獨壓縮,佔據硬碟空間極小。
2、InnoDB
MySQL5.5及其之後預設的儲存引擎
InnoDB有2種儲存方式
- 共享表空間儲存:所有表的定義、資料、索引存放在同一個表空間中。
- 獨佔表空間儲存:一張表獨佔一個表空間,表的定義儲存在.frm檔案中,資料、索引儲存在.ibd檔案中。
特點
- 自動增長列必須是主鍵,如果是組合主鍵,也必須是組合主鍵的第一列
- 支援外來鍵約束。MySQL的儲存引擎中只有innoDB支援外來鍵。外來鍵降低了查詢速度(因為要查多張表)、使多張表耦合在一起,但更好地體現了實體、表之間的關聯。
- 支援事務,恢復能力強。預設的事務隔離級別為可重複讀
- 使用的鎖粒度為行級鎖,支援更高的併發。行級鎖、事務,安全性有了,但是以犧牲效率換來的。
- 會將查詢的結果(索引+資料)放到緩衝池中,加快後續查詢的速度
- 發生故障後恢復性好。未完成的事務將根據redo log的資料重做;已提交但未寫入的修改,將從doublewrite buffer重做;系統閒時會purge buffer
- 主鍵索引是聚集索引(Clustered index,僅InnoDB支援),根據主鍵查詢時效率高,但根據主鍵進行刪改時效率低。聚集索引:物理儲存順序與索引順序相同
- 支援線上熱備
適用場景
- 對安全性有要求(事務+恢復性好),比如財務、計費、銀行
- 併發高(行級鎖)
- 使用外來鍵
可以在join查詢中混用InnoDB引擎的表、其他引擎的表
MyISAM、InnoDB的對比
(1)鎖粒度不同,InnoDB為行級鎖,MyISAM為表級鎖
- InnoDB對併發的支援遠比MyISAM高
- 但InnoDB鎖衝突的概率更大,更容易發生死鎖,而且為每一行加鎖,開銷也很大
(2)InnoDB支援外來鍵,MyISAM不支援
(3)InnoDB支援事務,MyISAM不支援
- InnoDB更安全,開銷也更大
(4)InnoDB快取查詢到的索引、資料,MyISAM只快取索引
(5)查詢效率MyISAM遠高於InnoDB,尤其是在資料錶行數多的時候
- MyISAM的索引中儲存的是資料(記錄)的指標(地址),先查索引確定要操作的記錄的地址,直接就去訪問這個地址
- InnoDB的索引儲存的是記錄的行號,從索引中查到行號(行座標),還需要逐行統計行號(從第一行開始數)
- 而且InnoDB在查詢過程中,要維護緩衝池中的查詢快取(索引+資料),MyISAM只需維護快取中的索引
(6)InnoDB支援線上熱備,有很成熟的線上熱備解決方案
(7)MyISAM的表文件包括:.frm(表定義),.MYI(索引),.MYD(資料),InnoDB的表文件為.frm(表定義),.ibd(索引、資料)
一句話,MyISAM效率更高、速度更快,InnoDB功能更全、安全性更好、開銷更大。
3、MEMORY
資料(記錄)不是儲存在檔案中,而是儲存在記憶體中。每個memory表對應一個.frm檔案(表定義、索引)。
特點
- 訪問速度極快。資料存放在記憶體中+使用HASH索引
- 宕機、關閉伺服器,資料會丟失
- 表的大小有限制(內初有限)
- 對錶的資料型別有限制。比如:只支援定長型別,VARCHAR會被自動儲存為CHAR型別,不支援TEXT、BLOB
- 鎖粒度為表級鎖。併發量大的時候,表級鎖會成為MEMORY儲存引擎的瓶頸
適用場景
- 儲存臨時、不重要的資料
- 大量讀 ,作為快取
如何選擇合適的儲存引擎
- 安全性要求(事務)
- 併發高不高
- 使不使用外來鍵
- 是否需要支援線上熱備
一個數據庫中,不同的表可以使用不同的儲存引擎。
使用合適的儲存引擎,會提高資料庫的效能。