存儲引擎 DBMS使用存儲引擎進行數據的創建、查詢、更新、刪除操作。 不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎還可以獲得特定的功能。 MySQL提供了多種存儲引擎,最常見的有3種。 1、MyISAM MySQL5.5之前的預設的存儲引擎,每個MyISAM在磁碟上 ...
存儲引擎
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存儲引擎的瓶頸
適用場景
- 存儲臨時、不重要的數據
- 大量讀 ,作為緩存
如何選擇合適的存儲引擎
- 安全性要求(事務)
- 併發高不高
- 使不使用外鍵
- 是否需要支持線上熱備
一個資料庫中,不同的表可以使用不同的存儲引擎。
使用合適的存儲引擎,會提高資料庫的性能。