🍖存储引擎介绍
一.存儲引擎介紹
1.什么是存儲引擎(比喻成表類型)
在講存儲引擎之前我們來做個比喻 : 現實生活中我們我們存儲的數據文件有不同的類型, 每種文件類型對應各自不同的處理機制
比如一個視屏文件,可以轉換成mp4、avi、wmv, 一個圖片可以是png、jpg
我們電腦的磁盤上也會存在不同類型的文件系統, Windows里常見的ntfs、fat32,Linux里常見的ext3、ext4、xfs等
數據庫中的表也應該有不同的類型, 表的類型不同, 會對應mysql不同的存取機制, 表類型又稱為存儲引擎
2.為什么有多種存儲引擎
如同上面的比喻, 雖然一個視頻文件的類型不一樣, 但是呈現的內容都是一樣的
表數據也是這樣, 一張表的數據無論使用什么存儲引擎, 用戶能看到的數據是一樣的, 不同的儲引擎存取, 引擎功能, 占用空間大小, 讀取性能等可能有區別
說白了, 存儲引擎就是在如何存儲數據、提取數據、更新數據等技術方法的實現上, 底層的實現方式不同, 那么就會呈現出不同存儲引擎有著一些自己獨有的特點和功能, 對應著不同的存取機制
于是乎, 用戶在使用的時候根據自己不同的業務場景選擇不同的存儲引擎, 其中MySQL最常用的存儲引擎為:MyISAM和InnoDB (下面詳細介紹)
ps : 在Oracle 和SQL Server等數據庫中只有一種存儲引擎,所有數據存儲管理機制都是一樣的
3.MySQL的工作流程
二.Mysql四種主要的存儲引擎
1.InnoDB
Mysql 5.5 版本及之后的默認存儲引擎
優點 : 支持事務, 行級鎖定和外鍵約束對數據的安全性較高
特點 : 行鎖設計、支持外鍵,并支持類似 Oracle 的非鎖定讀,即默認讀取操作不會產生鎖
缺點 : 相對于MyISAM速度較低, 但安全性較高
存儲結構 : 每個InnoDB(索引引擎, 自帶索引)在磁盤上存儲成2個文件,其中文件名和表名都相同
t01.frm # 存放的是表結構
t01.idb # 存放的是 索引 + 數據
2.MyISAM
Mysql 5.5 版本之前的默認存儲引擎
優點 : 訪問速度相對Innodb更快
缺點 : 不支持事務, 也不支持外鍵, 對事務完整性沒有要求, 數據的安全性沒有Innodb高
存儲結構 : 每個MyISAM在磁盤上存儲成3個文件, 其中文件名和表名都相同
t01.frm # 表結構
t01.MYD # MyDaata 存放的是數據
t01.MYI # MyIndex 存放的是索引
3.Memory
優點 : 采用內存存儲, 數據的讀取非常快
缺點 : 數據庫重啟或發生崩潰,表中的數據都將消失
存儲結構 : 每個Memory在磁盤上存儲成1個文件,其中文件名和表名都相同
t01.frm # 表結構
4.Blackhole
特點 : 黑洞, 無論存什么都會消失, 類似Linux中的 dev/null
應用 : 可以應用于主備復制中的分發主庫
三.MyISAM與InnoDB的區別
1.存儲結構不同
每個MyISAM在磁盤上存儲成三個文件
每個InnoDB在磁盤上存儲成2個文件
2.存儲空間
MyISAM可被壓縮, 存儲空間較小
InnoDB需要更多的內存和存儲, 它會在主內存中建立其專用的緩沖池用于高速緩沖數據和索引
3.事物支持
MyISAM強調的是性能, 每次查詢具有原子性, 其執行速度比Innodb類型更快, 但是不提供事物支持
InnoDB提供事務支持, 外部鍵等高級數據庫功能, 具有事務(commit)、回滾(rollback)和崩潰修復能力(crach recovery capabilities)的事務安全(transaction-safe ACID compliant)型表
4.外鍵
InnoDB支持外鍵, MyISAM不支持
5.增刪改查操作
如果執行大量的select, MyISAM是更好的選擇(因為沒有支持行級鎖), 在增刪的時候需要鎖定整個表格, 效率會低一些, 而innoDB支持行級鎖, 刪除插入的時候只需要鎖定該行就行,效率較高;
如果你的數據執行大量的insert或update, 出于性能方面的考慮, 應該使用InnoDB表, Delete從性能上Innodb更優
但delete from table時,InnoDB不會重新建立表,而是一行一行的刪除,在innodb上如果要清空保存有大量數據的表,最好使用truncate table這個命令
6.應用
MyISAM適合查詢以及插入為主的應用
InnoDB適合頻繁修改以及涉及到安全性較高的應用
四.其他存儲引擎(了解)
5.NDB 存儲引擎
2003 年,MySQL AB 公司從 Sony Ericsson 公司收購了 NDB 存儲引擎。 NDB 存儲引擎是一個集群存儲引擎,類似于 Oracle 的 RAC 集群,不過與 Oracle RAC 的 share everything 結構不同的是,其結構是 share nothing 的集群架構,因此能提供更高級別的 高可用性。NDB 存儲引擎的特點是數據全部放在內存中(從 5.1 版本開始,可以將非索引數 據放在磁盤上),因此主鍵查找(primary key lookups)的速度極快,并且能夠在線添加 NDB 數據存儲節點(data node)以便線性地提高數據庫性能。由此可見,NDB 存儲引擎是高可用、 高性能、高可擴展性的數據庫集群系統,其面向的也是 OLTP 的數據庫應用類型。
6.Infobright 存儲引擎
第三方的存儲引擎。其特點是存儲是按照列而非行的,因此非常 適合 OLAP 的數據庫應用。其官方網站是 http://www.infobright.org/,上面有不少成功的數據 倉庫案例可供分析。
7.NTSE 存儲引擎
網易公司開發的面向其內部使用的存儲引擎。目前的版本不支持事務, 但提供壓縮、行級緩存等特性,不久的將來會實現面向內存的事務支持。
ps : Mysql 支持的存儲引擎非常多, 上面只是常見存儲引擎, 還支持自定義, 也就是自己寫一個
五.不同存儲引擎的使用對比
1.查看存儲引擎
show engines; # 查看安裝的mysql所有支持的存儲引擎
show variables like 'storage_engine%'; # 查看當前正在使用的存儲引擎
2.創建不同的表并指定不同的存儲引擎
create table innodb_t01(id int) engine=innodb; # 末尾指定InnoDB存儲引擎
create table myisam_t02(id int) engine=myisam; # 指定MyISAM存儲引擎
create table memory_t03(id int) engine=memory; # 指定memory存儲引擎
create table blackhole_t04(id int) engine=blackhole; # 指定Blackhole存儲引擎
3.分別向四個表中插入數據
insert into innodb_t01 values(1),(2); # 插入 ID 1 和 2 ,下同
insert into myisam_t02 values(1),(2);
insert into memory_t03 values(1),(2);
insert into blackhole_t04 values(1),(2);
4.查看四張表的內容變化
select * from innodb_t01;
select * from myisam_t02;
select * from memory_t03;
select * from blackhole_t04; # 注意 : 黑洞
結論 : 對于blackhole類型的表, 往表內插入任何數據, 都相當于丟入黑洞, 表內永遠不存記錄
5.重啟Mysqld查看memory表的變化
重啟 mysql
再次查看 memory_t03 表
結論 : 對于memory類型的表,在重啟mysql或者重啟機器后,表內數據清空
六. 表的詳細操作
下一篇將詳細介紹表的操作
總結
以上是生活随笔為你收集整理的🍖存储引擎介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12个git实战建议和技巧
- 下一篇: django开发后台接口error 10