myisam
innodb
構(gòu)成上的區(qū)別:
? ? ? ?每個(gè)myisam在磁盤上存儲成三個(gè)文件。第一個(gè)文件的名字以表的名字開始,擴(kuò)展名指出文件類型。
? ? ? ?.frm文件存儲表定義。
? ? ? ?數(shù)據(jù)文件的擴(kuò)展名為.myd (mydata)。
? ? ? ?索引文件的擴(kuò)展名是.myi (myindex)。
? ? ? ?基于磁盤的資源是innodb表空間數(shù)據(jù)文件和它的日志文件,innodb 表的大小只受限于操作系統(tǒng)文件的大小,一般為 2gb
事務(wù)處理上方面:
? ? ? ?myisam類型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比innodb類型更快,但是不提供事務(wù)支持
? ? ? ?innodb提供事務(wù)支持事務(wù),外部鍵等高級數(shù)據(jù)庫功能
select ? update,insert,delete操作
? ? ? ?如果執(zhí)行大量的select,myisam是更好的選擇
1.如果你的數(shù)據(jù)執(zhí)行大量的insert或update,出于性能方面的考慮,應(yīng)該使用innodb表
2.delete ? from table時(shí),innodb不會重新建立表,而是一行一行的刪除。
3.load ? table from master操作對innodb是不起作用的,解決方法是首先把innodb表改成myisam表,導(dǎo)入數(shù)據(jù)后再改成innodb表,但是對于使用的額外的innodb特性(例如外鍵)的表不適用
對auto_increment的操作
? ? ? ?每表一個(gè)auto_incremen列的內(nèi)部處理。
myisam為insert和update操作自動更新這一列。這使得auto_increment列更快(至少10%)。在序列頂?shù)闹当粍h除之后就不能再利用。(當(dāng)auto_increment列被定義為多列索引的最后一列,可以出現(xiàn)重使用從序列頂部刪除的值的情況)。
? ? ? ?auto_increment值可用alter table或myisamch來重置
? ? ? ?對于auto_increment類型的字段,innodb中必須包含只有該字段的索引,但是在myisam表中,可以和其他字段一起建立聯(lián)合索引
? ? ? ?更好和更快的auto_increment處理
? ? ? ?如果你為一個(gè)表指定auto_increment列,在數(shù)據(jù)詞典里的innodb表句柄包含一個(gè)名為自動增長計(jì)數(shù)器的計(jì)數(shù)器,它被用在為該列賦新值。
? ? ? ?自動增長計(jì)數(shù)器僅被存儲在主內(nèi)存中,而不是存在磁盤上
? ? ? ?關(guān)于該計(jì)算器的算法實(shí)現(xiàn),請參考
auto_increment列在innodb里如何工作
表的具體行數(shù)
? ? ? ?select count(*) from table,myisam只要簡單的讀出保存好的行數(shù),注意的是,當(dāng)count(*)語句包含 ? where條件時(shí),兩種表的操作是一樣的
? ? ? ?InnoDB 中不保存表的具體行數(shù),也就是說,執(zhí)行select count(*) from table時(shí),InnoDB要掃描一遍整個(gè)表來計(jì)算有多少行
鎖
? ? ? ?表鎖
? ? ? ?提供行鎖(locking on row level),提供與 Oracle 類型一致的不加鎖讀取(non-locking read in
? ? ? ? SELECTs),另外,InnoDB表的行鎖也不是絕對的,如果在執(zhí)行一個(gè)SQL語句時(shí)mysql不能確定要掃描的范圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%”