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