mysql 存儲引擎 innodb和myISAM(轉)

mysql5.5+的版本默認引擎都是InnoDB,早期的Mysql版本默認的存儲引擎是myISAMhtml

innodb:mysql

1.事務操做
2.外鍵操做
3.行級鎖,這是當有where條件的時候。沒有where時,不知道在那一個範圍進行搜索時,也是表鎖.提供和 Oracle 同樣的一致性的不加鎖讀取,能增長併發讀的用戶數量並提升性能,不會增長鎖的數量。
4.寫的速度快,這是創建在索引的更新操做上sql

5.InnoDB 的設計目標是處理大容量數據時最大化性能,它的 CPU 利用率是其餘全部基於磁盤的關係數據庫引擎中最有效率的,在技術上,InnoDB 是一套放在 MySQL 後臺的完整數據庫系統,InnoDB 在主內存中創建其專用的緩衝池用於高速緩衝數據和索引。 InnoDB 把數據和索引存放在表空間裏,可能包含多個文件,這與其它的不同,舉例來講,在 MyISAM 中,表被存放在單獨的文件中。InnoDB 表的大小隻受限於操做系統的文件大小,通常爲 2 GB。   
InnoDB全部的表都保存在同一個數據文件 ibdata1 中(也多是多個文件,或者是獨立的表空間文件),相對來講比較很差備份,免費的方案能夠是拷貝數據文件、備份 binlog,或者用 mysqldump。   

數據庫

myisam:安全

1.表級鎖
2.讀取速度快
3.索引壓縮更好
4.更好和更快的auto_increment處理併發

myISAM的一個缺陷是崩潰後沒法安全恢復。性能

MyISAM會將表存儲在兩個文件中:數據文件和索引文件,分別以.MYD和.MYI爲擴展名操作系統

COUNT() 在 MyISAM 表中會很是快,而在InnoDB 表下可能會很痛苦。而主鍵查詢則在InnoDB下會至關至關的快,但須要當心的是若是咱們的主鍵太長了也會致使性能問題。大批的inserts 語句在 MyISAM下會快一些,可是updates 在InnoDB 下會更快一些——尤爲在併發量大的時候。.net

myisam與innodb這兩種引擎對索引的實現方式也不一樣。設計

myiasm是使用B-樹的結構來實現主碼,非主碼,惟一索引。

innodb是使用B+樹結構來實現主碼,用B-樹來實現非主碼。

如下是一些細節和具體實現的差異:

一、InnoDB不支持FULLTEXT類型的索引。

二、InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行數便可。注意的是,當count(*)語句包含 where條件時,兩種表的操做是同樣的。

三、對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,可是在MyISAM表中,能夠和其餘字段一塊兒創建聯合索引。

四、DELETE FROM table時,InnoDB不會從新創建表,而是一行一行的刪除。

五、LOAD TABLE FROM MASTER操做對InnoDB是不起做用的,解決方法是首先把InnoDB表改爲MyISAM表,導入數據後再改爲InnoDB表,可是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。

六、MyISAM的索引和數據是分開的,而且索引是有壓縮的,內存使用率就對應提升了很多。能加載更多索引,而Innodb是索引和數據是緊密捆綁的,沒有使用壓縮從而會形成Innodb比MyISAM體積龐大不小。

七、InnoDB表的行鎖也不是絕對的,假如在執行一個SQL語句時mysql不能肯定要掃描的範圍,InnoDB表一樣會鎖全表,例如update table set num=1 where name like 「%aaa%」

使用兩種的選擇:若是你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,
應該使用InnoDB表。若是執行大量的SELECT,MyISAM是更好的選擇。若須要使用事務處理,
可是原來的數據表使用的是myisam,就須要改成bdb或者innodb,這樣基於myisam的程序,
將類型改成innodb後,其程序不用改動…… 綜上所述,任何一種表都不是萬能的,只有恰當的針對業務類型來選擇合適的表類型,才能
最大的發揮MySQL的性能優點。

參考文獻:http://www.cnblogs.com/myblog1314/archive/2013/06/05/3118370.html;

http://blog.csdn.net/xifeijian/article/details/20316775

相關文章
相關標籤/搜索