1. 程式人生 > >MySql資料庫儲存引擎(MyISAM與InnoDB)

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支援效率更高的行鎖。