簡體   English   中英

什么是MySQL中的InnoDB和MyISAM?

[英]What is InnoDB and MyISAM in MySQL?

什么是MySQL InnoDBMyISAM

InnoDBMYISAMMySQL存儲引擎。

這兩個鎖定實現不同: InnoDB鎖定表中的特定行, MyISAM鎖定整個MySQL表。

您可以在DB中創建表時通過提供MYISAMInnoDB來指定類型。

看一下

InnoDBMyISAM

InnoDB是MySQL的存儲引擎,作為MySQL AB分發的所有當前二進制文件的標准配置。 它可以與MySQL一起使用的其他存儲引擎的主要增強功能是符合ACID標准的事務支持

MyISAM的是MySQL的關系數據庫管理系統版本的默認存儲引擎5.5之前的1 它基於較舊的ISAM代碼,但有許多有用的擴展。 MyISAM的主要缺點是缺乏交易支持。 MySQL 5.5及更高版本的版本已切換到InnoDB引擎,以確保參照完整性約束和更高的並發性。

它們是存儲引擎。

http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html

MyISAM:默認的MySQL存儲引擎,也是Web,數據倉庫和其他應用程序環境中使用最多的引擎。 MyISAM在所有MySQL配置中都受支持,並且是默認存儲引擎,除非您已將MySQL配置為默認使用其他MySQL。

InnoDB:適用於MySQL的事務安全(ACID兼容)存儲引擎,具有提交,回滾和崩潰恢復功能,可保護用戶數據。 InnoDB行級鎖定(沒有升級到更粗略的粒度鎖)和Oracle風格的一致非鎖定讀取增加了多用戶並發性和性能。 InnoDB將用戶數據存儲在聚簇索引中,以減少基於主鍵的常見查詢的I / O. 為了保持數據完整性,InnoDB還支持FOREIGN KEY參照完整性約束。

我想補充一點,有能力為每個表指定一個特定的存儲引擎是MySQL的關鍵優勢之一(除了易於使用和良好的性能,沒有調整)。 對於需要交易的所有操作,只需堅持使用InnoDB即可。 但是,在某些情況下不需要事務時,MyISAM可以真正加快速度 - 與InnoDB相比,需要更少的磁盤空間和RAM。

也就是說,InnoDB一直在變得越來越好:

InnoDB 1.1性能和可擴展性增強功能

MyISAM不遵循ACID而不是InnoDB,后者遵循事務來維護數據的完整性。

MyISAM支持並發插入:如果表在數據文件的中間沒有空閑塊,則可以在其他線程從表中讀取的同時將新行插入其中。 MySqlDoc

這就是為什么,MyISAM速度更快,占用空間更少。 例如,MySQL MyISAM存儲引擎不支持轉換。 MySQL MYISAM的約束有一種叫做concurrent-insert默認情況下,變量設置為1,並且如前所述處理並發插入。 如果設置為0,則禁用並發插入。 如果設置為2,則即使對於已刪除行的表,也允許在表末尾進行並發插入。 如果表中間沒有漏洞/刪除的行(在並發插入時),則可以執行INSERT語句以將行添加到表的末尾並同時選擇。

默認隔離級別og mysql InnoDB是“Read Repeatable”。 對於MyISAM,沒有交易。 InnoDB使用行級鎖定,而MyISAM只能使用表級鎖定,這就是為什么InnoDB崩潰重建比MyISAM更好。 如果想要避免並發效應,必須手動獲取 MyISAM中的表級鎖

InnoDB是默認的NOT myISAM https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html“InnoDB是默認的MySQL存儲引擎。除非你配置了不同的默認存​​儲引擎,否則發布一個沒有ENGINE =子句的CREATE TABLE語句創建一個InnoDB表“

當您的MySQL服務器崩潰時,從一組MyISAM表中可以比從大型InnoDB事務文件中恢復數據更容易。 每個MyISAM表都有一個單獨的文件,如果在崩潰期間沒有對該表進行寫操作 - 它將完全不受影響。 對於InnoDB,整個MySQL服務器的整個事務文件必須重新編制索引,或者在崩潰后執行任何操作。 這可能會變得非常混亂。

InnoDB是MySQL的事務存儲引擎,而MyISAM是非事務性存儲引擎。 換句話說,InnoDB遵循ACID屬性來維護數據的完整性,但MyISAM不遵循ACID屬性,因此無法保持數據的完整性。

在InnoDB(事務性)表中,如果需要回滾,則可以輕松撤消事務更改。 但是,在需要回滾事務時,無法撤消對MyISAM(非事務性)表所做的更改。

例如,您希望將支票帳戶中的資金轉帳到儲蓄帳戶。 這是由包含5個查詢的事務完成的。

1 START TRANSACTION;
2 SELECT balance FROM checking WHERE customer_id = 10233276;
3 UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
4 UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
5 COMMIT;

假設,該過程在步驟4崩潰。如果在此使用InnoDB表,則回滾將撤消更改,您可以免於賠錢的風險。 從字面上看,表格不知道任何崩潰,因為除非成功執行第5步,否則不會將更改提交到表中。

但是在MyISAM表的情況下,當調用回滾或導致事務失敗的崩潰時,無法撤消事務更改。 這意味着,如果交易在步驟3中崩潰,將從您的支票賬戶中扣除資金。 但是錢不會被添加到您的儲蓄賬戶中。

示例禮貌: “高性能MySQL:優化,備份和復制” - 由Arjen Lentz,Derek J. Balling,Jeremy Zawodny,Peter Zaitsev和Vadim Tkachenko撰寫的書

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM