MyIsam與InnoDB主要有如下4點大的區別,緩存機制,事務支持,鎖定實現,數據物理存儲方式(包括索引和數據)。html
myisam 僅僅緩存索引,不會緩存實際數據信息,他會將這一工做交給OS級別的文件系統緩存。因此mysiam緩存優化工做集中在索引緩存優化上。mysql
InnoDB 有本身的緩存(buffer pool),不單單緩存索引,還緩存表數據。sql
(因爲myisam不會緩存表數據文件(.MYD),每次讀取數據文件都須要調用文件系統的相關指令從磁盤上讀取物理文件。因此每次讀取數據文件所需的內存緩衝區的設置就對數據文件的訪問性能很是重要。mysql提供瞭如下兩種讀取數據文件緩衝區,Sequential Scan方式(如全表掃描)Random Scan(如經過索引掃描),這兩個緩衝區不是某個存儲引擎特有的,都是線程獨享,每一個線程在須要的時候都會建立一個(或者兩個)系統中設置設置大小的緩衝區。)緩存
myisam 不支持事務。dom
InnoDB 支持事務,也支持主外鍵。性能
myisam 鎖定是由mysql服務控制,只支持表級鎖。優化
innoDB 鎖定交由InnoDB存儲引擎,支持行級鎖,頁級鎖等粒度更小的鎖定級別。因爲鎖定級別的差別,在更新並行度上InnoDB會比myisam好不少spa
一、文件存放方式線程
myisam 每一個表有三個文件,.frm 存放表結構數據.MYI 存放索引信息.MYD存放表數據3d
innodb 存儲數據有.FRM存放表定義,.ibd(獨享表空間),.ibdata(共享表空間).innodb存儲數據分獨立表空間和共享表空間(具體使用哪一個由innodb_file_per_table變量肯定),獨享表空間存儲方式使用「.ibd」文件來存放數據,且每一個表一個「.ibd」文件,文件存放在和MyISAM 數據相同的位置,由datadir肯定。若是選用共享存儲表空間來存放數據,則會使用ibdata 文件來存放,全部表共同使用一個(或者多個,可自行配置)ibdata 文件。ibdata 文件能夠經過innodb_data_home_dir 和innodb_data_file_path
兩個參數共同配置組成, innodb_data_home_dir 配置數據存放的總目錄。
二、表數據物理存放方式
myisam 表數據存放在.MYD文件裏,沒有使用頁來存儲數據,也沒有表空間的概念。myisam沒有彙集索引。myisam有三種存儲格式:靜態格式,動態格式,壓縮格式。
InnoDB 將全部數據存放在數據頁中(page),通常狀況下非壓縮頁大小16K。InnoDB的數據文件自己要按主鍵彙集,因此InnoDB要求表必須有主鍵(MyISAM能夠沒有),若是沒有顯式指定,則MySQL系統會自動選擇一個能夠惟一標識數據記錄的列做爲主鍵,若是不存在這種列,則MySQL自動爲InnoDB表生成一個隱含字段做爲主鍵,這個字段長度爲6個字節,類型爲長整形。innod有共享表空間和獨享表空間之分,由innodb_file_per_table參數控制。如下爲InnoDB的表空間結構圖:
InnoDB 行,頁,集合,段,表空間之間的關係
三、索引數據存儲方式
MyIsam 索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。主索引和輔助索引沒有區別都是非彙集索引。索引頁正常大小爲1024字節,索引頁存放在.MYI 文件中。MyISAM引擎使用B+Tree做爲索引結構,葉節點的data域存放的是數據記錄的地址。下圖是MyISAM索引的原理圖:(借圖)
InnoDB 也使用B+Tree做爲索引結構,索引頁大小16,和表數據頁共同存放在表空間中。從InnoDB表數據存放方式可看出InnoDB表數據文件自己就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,所以InnoDB表數據文件自己就是主索引。下圖是主索引也就是表數據自己的結構圖(借的blog.codinglabs.org)也能夠稱爲彙集索引
下圖是輔助索引結構圖:
以上參考mysql 核心內幕總結的,有不對的地方歡迎拍磚。