🍖存儲引擎介紹( 表類型)

一.存儲引擎介紹

1.什麼是存儲引擎(表類型)

在講存儲引擎以前咱們來作個比喻 : 現實生活中咱們咱們存儲的數據文件有不一樣的類型, 每種文件類型對應各自不一樣的處理機制css

  • 好比一個視屏文件,能夠轉換成mp四、avi、wmv, 一個圖片能夠是png、jpgnode

  • 咱們電腦的磁盤上也會存在不一樣類型的文件系統, Windows裏常見的ntfs、fat32Linux裏常見的ext三、ext四、xfspython

  • 數據庫中的表也應該有不一樣的類型, 表的類型不一樣, 會對應mysql不一樣的存取機制, 表類型又稱爲存儲引擎mysql

2.爲何有多種存儲引擎

如同上面的比喻, 雖然一個視頻文件的類型不同, 可是呈現的內容都是同樣的sql

  • 表數據也是這樣, 一張表的數據不管使用什麼存儲引擎, 用戶能看到的數據是同樣的, 不一樣的儲引擎存取, 引擎功能, 佔用空間大小, 讀取性能等可能有區別數據庫

  • 說白了, 存儲引擎就是在如何存儲數據、提取數據、更新數據等技術方法的實現上, 底層的實現方式不一樣, 那麼就會呈現出不一樣存儲引擎有着一些本身獨有的特色和功能, 對應着不一樣的存取機制緩存

  • 因而乎, 用戶在使用的時候根據本身不一樣的業務場景選擇不一樣的存儲引擎, 其中MySQL最經常使用的存儲引擎爲:MyISAMInnoDB (下面詳細介紹)安全

  • ps : 在Oracle 和SQL Server等數據庫中只有一種存儲引擎,全部數據存儲管理機制都是同樣的架構

3.MySQL的工做流程

image-20210130090914956

二.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支持行級鎖, 刪除插入的時候只須要鎖定該行就行,效率較高;
  • 若是你的數據執行大量的insertupdate, 出於性能方面的考慮, 應該使用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%';  # 查看當前正在使用的存儲引擎

image-20210130160655547

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存儲引擎

image-20210130162213876

image-20210130163155241

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);

image-20210130162935995

4.查看四張表的內容變化

select * from innodb_t01;
select * from myisam_t02;
select * from memory_t03;
select * from blackhole_t04;  # 注意 : 黑洞

image-20210130163832253

結論 : 對於blackhole類型的表, 往表內插入任何數據, 都至關於丟入黑洞, 表內永遠不存記錄

5.重啓Mysqld查看memory表的變化

  • 重啓 mysql

image-20210130164113235

  • 再次查看 memory_t03

image-20210130164315199

結論 : 對於memory類型的表,在重啓mysql或者重啓機器後,表內數據清空

六. 表的詳細操做

下一篇將詳細介紹表的操做

相關文章
相關標籤/搜索