MySql資料庫儲存引擎(MyISAM與InnoDB)
MySql可以將資料以不同的技術儲存在檔案(記憶體)中,這種技術就稱為儲存引擎。而每一種儲存引擎也使用不同的儲存機制、索引技巧、鎖定水平,最終提供廣泛且不同的功能。常見的儲存引擎有MyISAM,InnoDB,Memory,Archive等。
本文主要介紹的是:MyISAM與InnoDB。在5.5版本之前,MyISAM是MySQL的預設資料庫引擎。雖然效能極佳,但卻有一個缺點:不支援事務處理。在之後,MySql的預設資料庫引擎就是InnoDB了。與MyISAM相比,InnoDB的最大特色就是支援了ACID相容的事務(Transaction)功能,以及外部鍵等高階資料庫功能。下面就主要聊聊這兩者的具體區別。
MyISAM與InnoDB的區別
儲存結構
MyISAM:每個MyISAM在磁碟上儲存成三個檔案。
table_name.frm 儲存表結構(定義)。
table_name.MYD 儲存資料
table_name.MYI 儲存索引檔案
InnoDB:把資料儲存在表空間中,分為兩種方式:
1)、所有InonoDB表的資料和索引放置於同一個表空間中;
2)、每個表單獨使用一個表空間儲存表的資料和索引。
當所有表位於同一表空間中,其資料檔案存於資料目錄下以ibddata[#]來命名。這種方式不利於管理和備份恢復。所以一般使用第二種方式,每張表建立單獨的表空間,用來實現InnoDB所支援的高階特性,比如單表匯入匯出,單標備份等功能。資料檔案為:
table_name.ibd 儲存資料和索引
table_name.frm 儲存表結構(定義)
事務支援
MyISAM:強調效能,其執行速度比InnoDB型別更快但不提供事務的支援,也不支援外來鍵,適用於大量select操作的應用場景。
InnoDB:支援事務,並把事務分為四個隔離級別,
READ-UNCOMMITTED: 讀未提交容易發生髒讀;
READ-COMMITTED: 讀提交,該級別不可重複讀;
REPEATABLE-READ: 可重複讀,該級別容易發生幻讀;
SERIALIZABLE: 序列化;
預設級別為REPEATABLE-READ。適合對事務要求較高的場景中,較適用於處理大量短期事務。
同時,InnoDB也支援外部鍵等高階資料庫功能。 具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。
鎖粒度
MyISAM:只支援表鎖。,使用者在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以後的表滿足insert併發的情況下,可以在表的尾部插入新的資料。
InnoDB:支援行鎖,極大提升併發能力,並使用間隙鎖來防止幻讀。當然InnoDB的行級鎖也並非絕對,當SQL語句在執行過程中在不能確定掃描範圍時也會對整張表進行鎖定(只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的)。
索引型別
MyISAM:非聚集索引並且支援全文索引(fulltext index)。允許沒有任何索引和主鍵的表存在,索引都是儲存行的地址。
InnoDB:聚集索引,輔助索引,可以使用sphinx外掛支援全文索引。如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6位元組的主鍵(使用者不可見),資料是主索引的一部分,附加索引儲存的是主索引的值的資料列。
AUTO_INCREMENT
MyISAM:可以和其他欄位一起建立聯合索引。引擎的自動增長列必須是索引,如果是組合索引,自動增長可以不是第一列,他可以根據前面幾列進行排序後遞增。
InnoDB:InnoDB中必須包含只有該欄位的索引。引擎的自動增長列必須是索引,如果是組合索引也必須是組合索引的第一列。
儲存空間
MyISAM:可被壓縮,儲存空間較小。支援三種不同的儲存格式:靜態表(預設)、動態表、壓縮表。
InnoDB:需要更多的記憶體和儲存,它會在主記憶體中建立其專用的緩衝池用於高速緩衝資料和索引。
備份及恢復策略
MyISAM:只支援溫備與冷備。崩潰後無法安全恢復。
InnoDB:支援熱備、溫備、冷備。崩潰後可安全恢復。
其他
1)、MyISAM儲存有表的總行數,如果select count() from table;會直接取出出該值。InnoDB沒有儲存表的總行數,如果使用select count() from table;就會遍歷整個表,消耗相當大,但是在加了wehre條件後,myisam和innodb處理的方式都一樣。
2)、MyISAM不支援外來鍵;而InnoDB支援外來鍵。
3)、MyISAM不支援hash索引;InnoDB支援自適應的hash索引,使用MVCC來支援高併發。
檢視與修改資料庫引擎
檢視資料庫引擎
show create table table_name;
修改表的儲存引擎
1、修改mysql的配置檔案
default-storage-engine = engine_name
2、通過建立表的命令實現
create table table_name(
......
)engine = engine_name;
3、表單建立完成後,通過修改資料表命令實現
alter table table_name engine = engine_name;
MyISAM和InnoDB的選擇
資料庫引擎的選擇需要我們根據實際情況來選擇。預設的InnoDB已經足夠使用。
(1)、當專案中需要事務處理或是外來鍵,那麼應該使用InnoDB 。如果你需要全文索引,那麼通常來說 MyISAM是好的選擇,因為這是系統內建的,但是,我們其實並不會經常地去海量記錄。所以,就算是慢一點,我們可以通過使用Sphinx從InnoDB中獲得全文索引。
(2)、資料的大小,同樣是一個影響你選擇什麼樣儲存引擎的重要因素,大尺寸的資料集趨向於選擇InnoDB方式,因為其支援事務處理和故障恢復。資料庫的在小決定了故障恢復的時間長短,InnoDB可以利用事務日誌進行資料恢復,這會比較快。而MyISAM可能會需要幾個小時甚至幾天來幹這些事,InnoDB只需要幾分鐘。
(3)、當併發量不大的時候,大批的insert語句或select語句在MyISAM下會快一些,因為MyISAM提供高速儲存和檢索,以及全文搜尋能力。但是當併發量大的時候,在用InnoDB就比MyISAM效率高多了。因為MyISAM只支援表鎖,而InnoDB支援效率更高的行鎖。