mysql存储引擎中INNODB和MyISAM的区别
切記:存儲引擎是基于表的,而不是數據庫。
存儲引擎概念:
MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平并且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。
顯示可用的數據庫引擎的全部名單以及在當前的數據庫服務器中是否支持這些引擎
mysql> show engines\G;
*************************** 1. row***************************
?????Engine: FEDERATED
????Support: NO
????Comment: Federated MySQL storage engine
Transactions: NULL
?????????XA: NULL
?Savepoints: NULL
*************************** 2. row***************************
?????Engine: MRG_MYISAM
????Support: YES
????Comment: Collection of identical MyISAM tables
Transactions: NO
?????????XA: NO
?Savepoints: NO
*************************** 3. row***************************
?????Engine: MyISAM
????Support: YES
????Comment: MyISAM storage engine
Transactions: NO
?????????XA: NO
?Savepoints: NO
*************************** 4. row***************************
?????Engine: BLACKHOLE
????Support: YES
????Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
?????????XA: NO
?Savepoints: NO
*************************** 5. row***************************
?????Engine: CSV
????Support: YES
????Comment: CSV storage engine
Transactions: NO
?????????XA: NO
?Savepoints: NO
*************************** 6. row***************************
?????Engine: MEMORY
????Support: YES
????Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
?????????XA: NO
?Savepoints: NO
*************************** 7. row***************************
?????Engine: ARCHIVE
????Support: YES
????Comment: Archive storage engine
Transactions: NO
?????????XA: NO
?Savepoints: NO
********** *********************** **********8. row ***************************
?????Engine: InnoDB
????Support: DEFAULT
????Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
?????????XA: YES
?Savepoints: YES
*************************** 9. row***************************
?????Engine: PERFORMANCE_SCHEMA
????Support: YES
????Comment: Performance Schema
Transactions: NO
?????????XA: NO
?Savepoints: NO
9 rows in set (0.25 sec)
類別詳解
MyISAM: 擁有較高的插入,查詢速度,但不支持事務
InnoDB?:5.5版本后Mysql的默認數據庫,事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定
BDB:源自Berkeley DB,事務型數據庫的另一種選擇,支持COMMIT和ROLLBACK等其他事務特性
Memory :所有數據置于內存的存儲引擎,擁有極高的插入,更新和查詢效率。但是會占用和數據量成正比的內存空間。并且其內容會在Mysql重新啟動時丟失
Merge :將一定數量的MyISAM表聯合而成一個整體,在超大規模數據存儲時很有用
Archive :非常適合存儲大量的獨立的,作為歷史記錄的數據。因為它們不經常被讀取。Archive擁有高效的插入速度,但其對查詢的支持相對較差
Federated:將不同的Mysql服務器聯合起來,邏輯上組成一個完整的數據庫。非常適合分布式應用
Cluster/NDB :高冗余的存儲引擎,用多臺數據機器聯合提供服務以提高整體性能和安全性。適合數據量大,安全和性能要求高的應用
CSV:邏輯上由逗號分割數據的存儲引擎。它會在數據庫子目錄里為每個數據表創建一個.CSV文件。這是一種普通文本文件,每個數據行占用一個文本行。CSV存儲引擎不支持索引。
BlackHole :黑洞引擎,寫入的任何數據都會消失,一般用于記錄binlog做復制的中繼
另外,Mysql的存儲引擎接口定義良好。有興趣的開發者通過閱讀文檔編寫自己的存儲引擎。(百度百科的)
InnoDB 與 MyISAM 的區別:
InnoDB
InnoDB 存儲引擎,主要面向 OLTP(OnlineTransaction Processing,在線事務處理)
方面的應用,是第一個完整支持 ACID 事務的存儲引擎(BDB 第一個支持事務的存儲引擎,
已經停止開發)。
特點:
行鎖設計、支持外鍵;
支持類似于 Oracle 風格的一致性非鎖定讀(即:默認情況下讀取操作不會產生鎖);
InnoDB 將數據放在一個邏輯的表空間中,由InnoDB 自身進行管理。從 MySQL4.1 版本開
始,可以將每個 InnoDB 存儲引擎的表單獨存放到一個獨立的 ibd 文件中;
InnoDB 通過使用 MVCC(多版本并發控制:讀不會阻塞寫,寫也不會阻塞讀)來獲得高并發
性,并且實現了 SQL 標準的 4 種隔離級別(默認為 REPEATABLE 級別);
InnoDB 還提供了插入緩沖(insertbuffer)、二次寫(double write)、自適應哈希索
引(adaptive hash index)、預讀(read ahead)等高性能和高可用的功能;
InnoDB 采用了聚集(clustered)的方式來存儲表中的數據,每張標的存儲都按主鍵的順
序存放(如果沒有顯式的在建表時指定主鍵,InnoDB會為每一行生成一個6字節的ROWID,
并以此作為主鍵);
InnoDB 表會有三個隱藏字段:除了上面提到了 6 字節的 DB_ROW_ID外,還有 6 字節的
DB_TX_ID(事務 ID)和 7 字節的DB_ROLL_PTR(指向對應回滾段的地址)。這個可以通過
innodb monitor 看到;
MyISAM
MyISAM 存儲引擎是 MySQL 官方提供的存儲引擎,主要面向
OLAP(Online Analytical Processing,在線分析處理)方面的應用。
特點:
不支持事務,支持表所和全文索引。操作速度快;
MyISAM 存儲引擎表由 MYD 和 MYI 組成,MYD 用來存放數據文件,MYI 用來存放索引文件。
MySQL 數據庫只緩存其索引文件,數據文件的緩存交給操作系統本身來完成;
MySQL5.0 版本開始,MyISAM 默認支持 256T 的單表數據;
INNODB表引擎
1.默認事務型引擎,最重要最廣泛的存儲引擎,性能非常優秀
2.數據存儲在共享表空間(多個表在一個文件中存儲),可以通過配置分開
3.對主鍵查詢的性能高于其他類型的存儲引擎
4.內部做了許多優化,從磁盤讀取數據時自動在內存構建hash索引
5.插入數據時自動構建插入緩沖區
6.通過機制和工具支持真正的熱備份
7.支持崩潰后的安全恢復
8.支持行級鎖
9.支持外鍵
MyISAM表引擎
1.5.1版本前,MyISAM是默認的存儲引擎
2.擁有全文索引,壓縮和空間函數
3.不支持事務和行級鎖,不支崩潰后的安全恢復
4.表存儲在兩個文件,MYD和MYI
5.設計簡單,某些場景下設計很好
作者:Mecury
鏈接:https://www.zhihu.com/question/20596402/answer/529312016
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
?
InnoDB:MySQL默認的事務型引擎,也是最重要和使用最廣泛的存儲引擎。它被設計成為大量的短期事務,短期事務大部分情況下是正常提交的,很少被回滾。InnoDB的性能與自動崩潰恢復的特性,使得它在非事務存儲需求中也很流行。除非有非常特別的原因需要使用其他的存儲引擎,否則應該優先考慮InnoDB引擎。
MyISAM:在MySQL 5.1 及之前的版本,MyISAM是默認引擎。MyISAM提供的大量的特性,包括全文索引、壓縮、空間函數(GIS)等,但MyISAM并不支持事務以及行級鎖,而且一個毫無疑問的缺陷是崩潰后無法安全恢復。正是由于MyISAM引擎的緣故,即使MySQL支持事務已經很長時間了,在很多人的概念中MySQL還是非事務型數據庫。盡管這樣,它并不是一無是處的。對于只讀的數據,或者表比較小,可以忍受修復操作,則依然可以使用MyISAM(但請不要默認使用MyISAM,而是應該默認使用InnoDB)
MySQL存儲引擎--MyISAM與InnoDB區別
1、 存儲結構
MyISAM:每個MyISAM在磁盤上存儲成三個文件。分別為:表定義文件、數據文件、索引文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數據文件的擴展名為.MYD (MYData)。索引文件的擴展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一個數據文件中(也可能是多個文件,或者是獨立的表空間文件),InnoDB表的大小只受限于操作系統文件的大小,一般為2GB。
2、 存儲空間
MyISAM: MyISAM支持支持三種不同的存儲格式:靜態表(默認,但是注意數據末尾不能有空格,會被去掉)、動態表、壓縮表。當表在創建之后并導入數據之后,不會再進行修改操作,可以使用壓縮表,極大的減少磁盤的空間占用。
InnoDB: 需要更多的內存和存儲,它會在主內存中建立其專用的緩沖池用于高速緩沖數據和索引。
3、 可移植性、備份及恢復
MyISAM:數據是以文件的形式存儲,所以在跨平臺的數據轉移中會很方便。在備份和恢復時可單獨針對某個表進行操作。
InnoDB:免費的方案可以是拷貝數據文件、備份 binlog,或者用 mysqldump,在數據量達到幾十G的時候就相對痛苦了。
4、 事務支持
MyISAM:強調的是性能,每次查詢具有原子性,其執行數度比InnoDB類型更快,但是不提供事務支持。
InnoDB:提供事務支持事務,外部鍵等高級數據庫功能。 具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。
5、 AUTO_INCREMENT MyISAM:可以和其他字段一起建立聯合索引。引擎的自動增長列必須是索引,如果是組合索引,自動增長可以不是第一列,他可以根據前面幾列進行排序后遞增。
InnoDB:InnoDB中必須包含只有該字段的索引。引擎的自動增長列必須是索引,如果是組合索引也必須是組合索引的第一列。
6、 表鎖差異
MyISAM: 只支持表級鎖,用戶在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以后的表滿足insert并發的情況下,可以在表的尾部插入新的數據。
InnoDB: 支持事務和行級鎖,是innodb的最大特色。行鎖大幅度提高了多用戶并發操作的新能。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的。
7、 全文索引
MySql全文索引
MyISAM:支持 FULLTEXT類型的全文索引
InnoDB:不支持FULLTEXT類型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
8、表主鍵
MyISAM:允許沒有任何索引和主鍵的表存在,索引都是保存行的地址。
InnoDB:如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6字節的主鍵(用戶不可見),數據是主索引的一部分,附加索引保存的是主索引的值。
9、表的具體行數
MyISAM: 保存有表的總行數,如果select count() from table;會直接取出出該值。
InnoDB: 沒有保存表的總行數,如果使用select count(*) from table;就會遍歷整個表,消耗相當大,但是在加了wehre條件后,myisam和innodb處理的方式都一樣。
10、CRUD操作
MyISAM:如果執行大量的SELECT,MyISAM是更好的選擇。
InnoDB:如果你的數據執行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表。
11、 外鍵
MyISAM:不支持
InnoDB:支持
DELIMITER
在mysql中每行命令都是用";"結尾,回車后自動執行,在存儲過程中“;”往往不代表指令結束,馬上運行,而delimiter原本就是“;”的意思,因此用這個命令轉換一下“;” 為 “$$”,這樣只有接收到“$$”才認為指令結束可以執行
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的mysql存储引擎中INNODB和MyISAM的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cgi,fastcgi,php-cgi,
- 下一篇: Tp3.2在nginx下隐藏index.