天天看點

Mysql有兩種存儲引擎InnoDB與Myisam對比

1)Mysql有兩種存儲引擎:InnoDB與Myisam,下表是兩種引擎的簡單對比

MyISAM InnoDB
構成上的差別:

每個MyISAM在磁盤上存儲成三個檔案。

1)第一個 檔案的名字以表的名字開始,

擴充名指出檔案類型。.frm檔案存儲表定義。

2)資料檔案的擴 展名為.MYD (MYData)。

3)索引檔案的擴 展名是.MYI (MYIndex)。

基于磁盤的資源是InnoDB表空間

資料檔案和它的日志檔案,

InnoDB 表的 大小隻受限于作業系統檔案的大小,

一般為 2GB

事務處理上方面:

1)MyISAM類型的表強調的是性能,

其執行數 度比InnoDB類型更快

2)但是不提供事務支援

InnoDB提供事務支援事務,外部鍵等進階 資料庫功能
SELECT  UPDATE INSERT Delete 執行大量的SELECT,MyISAM是更好的選擇

1.如果你的資料執行大量的INSERT或UPDATE,

出于性能方面的考慮,

應該使用InnoDB表

2.DELETE FROM table時,InnoDB不會重建立立表,

而是一行一行的 删除。

3.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,

解決方法是首先把InnoDB表改成MyISAM表,

導入資料後再改成InnoDB表,但是對于使用的額外的InnoDB特性

(例如外鍵)的表不适用

對AUTO_INCREMENT的 操作

1)每表一個AUTO_INCREMEN列的内部處理。

MyISAM為INSERT和UPDATE操

作自動更新這一列。這使得AUTO_INCREMENT

列更快(至少10%)。

2)在序列頂的值被删除之後就不 能再利用。(當AUTO_INCREMENT列被定義為多列索引的最後一列,

 可以出現重使用從序列頂部删除的值的情況)。

AUTO_INCREMENT值可用ALTER TABLE或

myisamch來重置

3)對于AUTO_INCREMENT類型的字段,

InnoDB中必須包含隻有該字段的索引,但 是在MyISAM表中,可以和其他字段一起建立聯 

合索引

更好和更快的auto_increment處理

如果你為一個表指定AUTO_INCREMENT列,

在資料詞典裡的InnoDB表句柄包含一個名為

自動增長計數 器的計數器,它被用在為該列賦新值。

自動增長計數 器僅被存儲在主記憶體中,而不是存在磁盤上

關于該電腦 的算法實作,請參考

AUTO_INCREMENT列 在InnoDB裡 如何工作

表的具體行數

select count(*) from table,

1)MyISAM隻要簡單的讀出儲存好的行數,

2)注意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的

InnoDB 中不 儲存表的具體行數,也就是說,

執行select count(*) from table時,

InnoDB要掃描一遍整個表來計算有多少行

鎖表

提供行鎖(locking on row level),

提供與 Oracle 類型一緻的不加鎖讀取(

non-locking read in SELECTs),

另外,InnoDB表的行鎖也不是絕對的,

如果在執 行一個SQL語句時

MySQL不能确定要掃描的範圍,

InnoDB表同樣會鎖全表,

例如update table set num=1 where name like “%aaa%”

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

2)MySQL存儲引擎MyISAM與InnoDB如何選擇

MySQL有多種存儲引擎,每種存儲引擎有各自的優缺點,可以擇優選擇使用:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。

雖然MySQL裡的存儲引擎不隻是MyISAM與InnoDB這兩個,但常用的就是兩個。

兩種存儲引擎的大緻差別表現在:

  1)InnoDB支援事務,MyISAM不支援,這一點是非常之重要。事務是一種進階的處理方式,如在一些列增删改中隻要哪個出錯還可以復原還原,而MyISAM就不可以了。

  2)MyISAM适合查詢以及插入為主的應用,InnoDB适合頻繁修改以及涉及到安全性較高的應用

  3)InnoDB支援外鍵,MyISAM不支援

  4)從MySQL5.5.5以後,InnoDB是預設引擎

  5)InnoDB不支援FULLTEXT類型的索引

  6)InnoDB中不儲存表的行數,如select count(*) from table時,InnoDB需要掃描一遍整個表來計算有多少行,但是MyISAM隻要簡單的讀出儲存好的行數即可。注意的是,當count(*)語句包含where條件時MyISAM也需要掃描整個表

  7)對于自增長的字段,InnoDB中必須包含隻有該字段的索引,但是在MyISAM表中可以和其他字段一起建立聯合索引

  8)清空整個表時,InnoDB是一行一行的删除,效率非常慢。MyISAM則會重建表

  9)InnoDB支援行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like '%lee%'

3)關于MyISAM與InnoDB選擇使用:

MYISAM和INNODB是Mysql資料庫提供的兩種存儲引擎。兩者的優劣可謂是各有千秋。INNODB會支援一些關系資料庫的進階功能,如事務功能和行級鎖,MYISAM不支援。MYISAM的性能更優,占用的存儲空間少。是以,選擇何種存儲引擎,視具體應用而定:

1)如果你的應用程式一定要使用事務,毫無疑問你要選擇INNODB引擎。但要注意,INNODB的行級鎖是有條件的。在where條件沒有使用主鍵時,照樣會鎖全表。比如DELETE FROM mytable這樣的删除語句。

2)如果你的應用程式對查詢性能要求較高,就要使用MYISAM了。MYISAM索引和資料是分開的,而且其索引是壓縮的,可以更好地利用記憶體。是以它的查詢性能明顯優于INNODB。壓縮後的索引也能節約一些磁盤空間。MYISAM擁有全文索引的功能,這可以極大地優化LIKE查詢的效率。

有人說MYISAM隻能用于小型應用,其實這隻是一種偏見。

如果資料量比較大,這是需要通過更新架構來解決,比如分表分庫,而不是單純地依賴存儲引擎。

現在一般都是選用innodb了,主要是myisam的全表鎖,讀寫串行問題,并發效率鎖表,效率低myisam對于讀寫密集型應用一般是不會去選用的

4)關于Mysql資料庫預設的存儲引擎:

MyISAM和InnoDB是MySQL的兩種存儲引擎。

如果是預設安裝,那就應該是InnoDB,你可以在my.cnf檔案中找到default-storage-engine=INNODB;

當然你可以在建表時指定相應的存儲引擎。

通過show create table xx 可以看見相應資訊。

5)Mysql中InnoDB和MyISAM的比較

  1)MyISAM:

每個MyISAM在磁盤上存儲成三個檔案。第一個檔案的名字以表的名字開始,擴充名指出檔案類型。.frm檔案存儲表定義。資料檔案的擴充名為.MYD (MYData)。

MyISAM表格可以被壓縮,而且它們支援全文搜尋。不支援事務,而且也不支援外鍵。如果事物復原将造成不完全復原,不具有原子性。在進行updata時進行表鎖,并發量相對較小。如果執行大量的SELECT,MyISAM是更好的選擇。

MyISAM的索引和資料是分開的,并且索引是有壓縮的,記憶體使用率就對應提高了不少。能加載更多索引,而Innodb是索引和資料是緊密捆綁的,沒有使用壓縮進而會造成Innodb比MyISAM體積龐大不小

MyISAM緩存在記憶體的是索引,不是資料。而InnoDB緩存在記憶體的是資料,相對來說,伺服器記憶體越大,InnoDB發揮的優勢越大。

優點:查詢資料相對較快,适合大量的select,可以全文索引。

缺點:不支援事務,不支援外鍵,并發量較小,不适合大量update

  2)InnoDB:(參數說明:Mysql存儲引擎之Innodb重要參數說明)

這種類型是事務安全的。.它與BDB類型具有相同的特性,它們還支援外鍵。InnoDB表格速度很快。具有比BDB還豐富的特性,是以如果需要一個事務安全的存儲引擎,建議使用它。在update時表進行行鎖,并發量相對較大。如果你的資料執行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表。

優點:支援事務,支援外鍵,并發量較大,适合大量update

缺點:查詢資料相對較快,不适合大量的select

對于支援事物的InnoDB類型的表,影響速度的主要原因是AUTOCOMMIT預設設定是打開的,而且程式沒有顯式調用BEGIN 開始事務,導緻每插入一條都自動Commit,嚴重影響了速度。可以在執行sql前調用begin,多條sql形成一個事物(即使autocommit打開也可以),将大大提高性能。

6)基本的差别為:

MyISAM類型不支援事務處理等進階處理,而InnoDB類型支援。

MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,但是不提供事務支援,而InnoDB提供事務支援已經外部鍵等進階資料庫功能。