MySQL中的 MyISAM和InnoDB 區別

一:構成上的區別mysql

每一個MyISAM在磁盤上存儲成三個文件。第一個 文件的名字以表的名字開始,擴展名指出文件類型。
.frm文件存儲表定義。
數據文件的擴 展名爲.MYD (MYData)。
索引文件的擴 展名是.MYI (MYIndex)。
基於磁盤的資源是InnoDB表空間數據文件和它的日誌文件,InnoDB 表的 大小隻受限於操做系統文件的大小,通常爲 2GB

    MyISAM引擎設計簡單,數據以緊密格式存儲,而且因爲分爲三個文件,能夠放到不一樣的磁盤,能夠同時操做,磁盤IO更快;MyISAM 默認會把索引讀入內存,直接在內存中操做;InnoDB 則是 I/O 操做;sql

  而且MyISAM索引是單獨的文件,能夠對索引進行壓縮;數據庫

二:事務處理oracle

MyISAM類型的表強調的是性能,其執行數 度比InnoDB類型更快,可是不提供事務支持 InnoDB提供事務支持事務,外部鍵等高級 數據庫功能

MyISAM因爲設計簡單,不支持事物性能

三:鎖優化




 

表鎖spa

提供行鎖(locking on row level),提供與 Oracle 類型一致的不加鎖讀取(non-locking read in
SELECTs),另外,InnoDB表的行鎖也不是絕對的,若是在執 行一個SQL語句時MySQL不能肯定要掃描的範圍,InnoDB表一樣會鎖全表,例如update table set num=1 where name like 「%aaa%」

innodb是行鎖,myism是鎖表,所以有innodb寫更快的說法操作系統

在更新少,讀取多的應用中,myism更快,雖然是表鎖,但鎖的時候少,利用索引分開優點,能夠讀入內存,快速查詢。可是若是更新頻繁,常常鎖表,讀取性能會極速降低。
innodb適合更新頻繁的場景,不然更新效率也不如myism。innodb索引數據混在一個文件,創建索引比myism複雜,在更新不頻繁的應用場景中,myism更快設計


四:表的具體行數日誌

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

 

myisam屬於堆表,數據寫入一直累積(concurrent_insert參數設置爲2);此時寫入性能比innodb好,可是不管是主鍵查詢仍是非主鍵查詢,都不可避免的須要二次io(除非能索引內完成字段記錄返回)
innodb屬於聚簇索引組織表(主鍵索引即數據),因爲必須保證索引有序,在寫入時須要找到合適的位置進行插入,有時候還會致使二叉樹調整因此寫入性能比myisam要差;可是主鍵查找時只須要一次io便可返回數據,非主鍵索引查詢時若是在索引內不能完成查詢記錄返回則須要第二次的io

 

五:清空表

InnoDB是一行一行的刪除,效率很是慢。MyISAM則會重建表

 

六:InnoDB不支持FULLTEXT類型的索引

 

總結:mysql5.6以後,官方就不推薦MyISAM,InnoDB通過後面一系列優化以後,性能以及達到百萬QPS,MyISAM基本等於廢棄了!

相關文章
相關標籤/搜索