存盤引擎
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存盤引擎的瓶頸
適用場景
- 存盤臨時、不重要的資料
- 大量讀 ,作為快取
如何選擇合適的存盤引擎
- 安全性要求(事務)
- 并發高不高
- 使不使用外鍵
- 是否需要支持在線熱備
一個資料庫中,不同的表可以使用不同的存盤引擎,
使用合適的存盤引擎,會提高資料庫的性能,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/74680.html
標籤:MySQL
下一篇:MySQL 資料型別
