MySQL 預設採用的是 MyISAM 。
MyISAM 不支援事務,而 InnoDB 支援。 InnoDB 的 AUTOCOMMIT 預設是開啟的,即每條 SQL 語句會預設被封裝成一個事務,自動提交,這樣會影響速度,所以最好是把多條 SQL 語句顯示放在 begin 和 commit 之間,組成一個事務去提交。
InnoDB 支援資料行鎖定,MyISAM 不支援行鎖定,只支援鎖定整個表。即 MyISAM 同一個表上的讀鎖和寫鎖是互斥的,MyISAM 併發讀寫時如果等待佇列中既有讀請求又有寫請求,預設寫請求的優先順序高,即使讀請求先到,所以 MyISAM 不適合於有大量查詢和修改並存的情況,那樣查詢程式會長時間阻塞。因為 MyISAM 是鎖表,所以某項讀操作比較耗時會使其他寫程式餓死。
InnoDB 支援外來鍵,MyISAM 不支援。
InnoDB 的主鍵範圍更大,最大是 MyISAM 的 2 倍。
InnoDB 不支援全文索引,而 MyISAM 支援。全文索引是指對 char 、 varchar 和 text 中的每個詞(停用詞除外)建立倒排序索引。 MyISAM 的全文索引其實沒啥用,因為它不支援中文分詞,必須由使用者分詞後加入空格再寫到資料表裡,而且少於 4 個漢字的詞會和停用詞一樣被忽略掉。
MyISAM 支援 GIS 資料,InnoDB 不支援。即 MyISAM 支援以下空間資料物件:Point,Line,Polygon,Surface 等。
沒有 where 的 count(*) 使用 MyISAM 要比 InnoDB 快得多。因為 MyISAM 內建了一個計數器,count(*) 時它直接從計數器中讀,而 InnoDB 必須掃描全表。所以在 InnoDB 上執行 count(*) 時一般要伴隨 where,且 where 中要包含主鍵以外的索引列。為什麼這裡特別強調 “主鍵以外”?因為 InnoDB 中 primary index 是和 raw data 存放在一起的,而 secondary index 則是單獨存放,然後有個指標指向 primary key 。所以只是 count(*) 的話使用 secondary index 掃描更快,而 primary key 則主要在掃描索引同時要返回 raw data 時的作用較大。