1. 程式人生 > >InnoDB與MyISAM資料引擎對比選擇

InnoDB與MyISAM資料引擎對比選擇

MySQL優勢之一是外掛式的儲存引擎架構將查詢處理和其它的系統任務以及資料的儲存提取相分離。而MySQL常見的資料庫引擎有兩種:InnoDB和MyISAM,那如何選擇呢?

1.InnoDB和MyISAM對比:

1)MySQL預設採用的是MyISAM。

2)MyISAM不支援事務,而InnoDB支援。InnoDB的AUTOCOMMIT預設是開啟的,即每條SQL語句會預設被封裝成一個事務,自動提交,這樣會影響速度,所以最好是把多條SQL語句顯示放在begin和commit之間,組成一個事務去提交。

3)InnoDB支援資料行鎖定,MyISAM不支援行鎖定,只支援鎖定整個表。即MyISAM同一個表上的讀鎖和寫鎖是互斥的,MyISAM併發讀寫時如果等待佇列中既有讀請求又有寫請求,預設寫請求的優先順序高,即使讀請求先到,所以MyISAM不適合於有大量查詢和修改並存的情況,那樣查詢程序會長時間阻塞。因為MyISAM是鎖表,所以某項讀操作比較耗時會使其他寫程序餓死。

4)InnoDB支援外來鍵,MyISAM不支援。

5)InnoDB的主鍵範圍更大,最大是MyISAM的2倍。

6)InnoDB不支援全文索引,而MyISAM支援。全文索引是指對char、varchar和text中的每個詞(停用詞除外)建立倒排序索引。MyISAM的全文索引其實沒啥用,因為它不支援中文分詞,必須由使用者分詞後加入空格再寫到資料表裡,而且少於4個漢字的詞會和停用詞一樣被忽略掉。

7)MyISAM支援GIS資料,InnoDB不支援。即MyISAM支援以下空間資料物件:Point,Line,Polygon,Surface等。

8)沒有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時的作用較大。

9)具體方面上的比較:

構成上的區別:

MyISAM:

每個MyISAM在磁碟上儲存成三個檔案。第一個檔案的名字以表的名字開始,副檔名指出檔案型別。

.frm檔案儲存表定義。

資料檔案的副檔名為.MYD (MYData)。

索引檔案的副檔名是.MYI (MYIndex)。

InnoDB:

基於磁碟的資源是InnoDB表空間資料檔案和它的日誌檔案,InnoDB 表的大小隻受限於作業系統檔案的大小,一般為 2GB

事務處理上方面:

MyISAM:

MyISAM型別的表強調的是效能,其執行數度比InnoDB型別更快,但是不提供事務支援

InnoDB:

InnoDB提供事務支援事務,外部鍵等高階資料庫功能

CURD操作:

MyISAM:

如果執行大量的SELECT,MyISAM是更好的選擇

InnoDB:

如果你的資料執行大量的INSERT或UPDATE,出於效能方面的考慮,應該使用InnoDB表

DELETE   FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。

LOAD   TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,匯入資料後再改成InnoDB表,但是對於使用的額外的InnoDB特性(例如外來鍵)的表不適用

對AUTO_INCREMENT的操作:

MyISAM:

每表一個AUTO_INCREMEN列的內部處理。

MyISAM為INSERT和UPDATE操作自動更新這一列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂部的值被刪除之後就不能再利用。(當AUTO_INCREMENT列被定義為多列索引的最後一列,可以出現重使用從序列頂部刪除的值的情況)。

AUTO_INCREMENT值可用ALTER TABLE或myisamch來重置

對於AUTO_INCREMENT型別的欄位,InnoDB中必須包含只有該欄位的索引,但是在MyISAM表中,可以和其他欄位一起建立聯合索引

更好和更快的auto_increment處理

InnoDB:

如果你為一個表指定AUTO_INCREMENT列,在資料詞典裡的InnoDB表控制代碼包含一個名為自動增長計數器的計數器,它被用在為該列賦新值。

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

表的具體行數:

MyISAM:

select count(*) from table,MyISAM只要簡單的讀出儲存好的行數,注意的是,當count(*)語句包含   where條件時,兩種表的操作是一樣的

InnoDB:

InnoDB 中不儲存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行

鎖:

MyISAM:

表鎖

InnoDB:

提供行鎖(locking on row level),提供與 Oracle 型別一致的不加鎖讀取(non-locking read in SELECTs),另外,InnoDB表的行鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%”

2.為什麼MySQL預設MyISAM引擎:

1)平臺上承載的大部分專案是讀多寫少的專案,而MyISAM的讀效能是比Innodb強不少的。

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

3)經常隔1,2個月就會發生應用開發人員不小心update一個表where寫的範圍不對,導致這個表沒法正常用了,這個時候MyISAM的優越性就體現出來了,隨便從當天拷貝的壓縮包取出對應表的檔案,隨便放到一個數據庫目錄下,然後dump成sql再導回到主庫,並把對應的binlog補上。如果是Innodb,恐怕不可能有這麼快速度,別和我說讓Innodb定期用匯出xxx.sql機制備份,因為最小的一個數據庫例項的資料量基本都是幾十G大小。

4)從接觸的應用邏輯來說,select count(*) 和order by 是最頻繁的,大概能佔了整個sql總語句的60%以上的操作,而這種操作Innodb其實也是會鎖表的,很多人以為Innodb是行級鎖,那個只是where對它主鍵是有效,非主鍵的都會鎖全表的。

5)還有就是經常有很多應用部門需要我給他們定期某些表的資料,MyISAM的話很方便,只要發給他們對應那表的frm.MYD,MYI的檔案,讓他們自己在對應版本的資料庫啟動就行,而Innodb就需要匯出xxx.sql了,因為光給別人檔案,受字典資料檔案的影響,對方是無法使用的。

6)如果和MyISAM比insert寫操作的話,Innodb還達不到MyISAM的寫效能,如果是針對基於索引的update操作,雖然MyISAM可能會遜色Innodb,但是那麼高併發的寫,從庫能否追的上也是一個問題,還不如通過多例項分庫分表架構來解決。

7)如果是用MyISAM的話,merge引擎可以大大加快應用部門的開發速度,他們只要對這個merge表做一些select count(*)操作,非常適合大專案總量約幾億的rows某一型別(如日誌,調查統計)的業務表。

檔案出處:

https://www.cnblogs.com/lyl2016/p/5797519.html

http://blog.csdn.net/xifeijian/article/details/20316775

相關推薦

InnoDBMyISAM資料引擎對比選擇

MySQL優勢之一是外掛式的儲存引擎架構將查詢處理和其它的系統任務以及資料的儲存提取相分離。而MySQL常見的資料庫引擎有兩種:InnoDB和MyISAM,那如何選擇呢? 1.InnoDB和MyISAM對比: 1)MySQL預設採用的是MyISAM。 2)MyISAM

Mysql資料庫InnodbMyISAM的效能對比測試

由於近期有個專案對系統性能要求很高,技術選型上由於種種原因已經確定使用Mysql資料庫,接下來就是要確定到底使用哪種儲存引擎。我們的應用是典型的寫多讀少,寫入內容為也很短,對系統的穩定性要求很高。所以儲存引擎肯定就定在廣泛使用的Innodb和MyISAM之中了。   

MySQL資料庫InnoDBMyISAM資料引擎的差別

InnoDB和MyISAM是在使用MySQL最常用的兩個表型別,各有優缺點,視具體應用而定。基本的差別為:MyISAM型別不支援事務處理等高階處理,而InnoDB型別支援。MyISAM型別的表強調的是效能,其執行數度比InnoDB型別更快,但是不提供事務支援,而InnoD

MySql中啟用InnoDB數據引擎簡介 以及 InnoDB MYISAM的區別和聯系

隔離級別 最終 全文索引 都是 後臺 isa llb ldb 優勢 1、存儲引擎是什麽?   MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,

MySQL InnoDBMyISAM存儲引擎差異

vco 重建 lec insert 需要 系統文件 name 單個 master 前言:   之前簡單介紹過 MySQL 常用的存儲引擎,今天對兩個主流的存儲簡單分析下差異,書上沒有參考的筆試題解答註解; 差異:   MyISAM 只支持表鎖,不支持事務,表損壞

Mysql 存儲引擎InnoDBMyisam的主要區別

sql mysq where條件 擴展 擴展名 sel 系統 sele sans innodb 支持事務功能,myisam 不支持。 Myisam 的執行速度更快,性能更好。 2、select ,update ,insert ,delete 操作 MyISAM:如果執行

INNODBMyISAM兩種表存儲引擎區別

耗時 關系數據庫 data 條件 表空間 height size org lob mysql數據庫分類為INNODB為MyISAM兩種表存儲引擎了,兩種各有優化在不同類型網站可能選擇不同,下面小編為各位介紹mysql更改表引擎INNODB為MyISAM技巧。常見的mysql

(轉)InnoDBMyISAM引擎區別

open 開發 定期 cpu 語句 文件中 有一個 怎麽 isolation MyISAM與InnoDB兩者之間區別與選擇,詳細總結,性能對比 2015年06月25日 21:58:42 閱讀數:1827更多 個人分類: mysql 1、MyISAM

Mysql 儲存引擎InnoDBMyisam的主要區別

MVCC ( Multi-Version Concurrency Control )多版本併發控制  InnoDB:通過為每一行記錄新增兩個額外的隱藏的值來實現MVCC,這兩個值一個記錄這行資料何時被建立,另外一個記錄這行資料何時過期(或者被刪除)。但是InnoDB並不儲存這些事件發生時的實際時間,相反它只

MySQL儲存引擎InnoDBMyisam的六大區別

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

InnoDBMyisam的區別

選擇 映射 myisam 出現 壓縮 select 並發控制 spa 支持 如何選擇存儲引擎: 如果不在乎可擴展能力和並發能力,也不在乎崩潰後數據的所示問題,卻對innoDB的空間占用過多比較敏感,這種場合應該使用MyISAM。否則應該使用InnoDB。如果需要使用在線熱備

InnoDBMyISAM索引結構

image eight width nod 分享 tle isam mage col 事實證明,一知半解在面試的時候是回答不清楚的InnoDB與MyISAM索引結構

mysql中InnoDBMyISAM的區別

兩者的區別: 1. InnoDB支援事務,MyISAM不支援,對於InnoDB每一條SQL語言都預設封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin和commit之間,組成一個事務; 2. InnoDB支援外來鍵,而MyISAM不支援。對一個包含外來鍵的InnoDB錶轉為MYI

Innodb MyISAM

一 鎖差異 MyISAM:只支援表級鎖,只支援表級鎖,使用者在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖。 InnodB:支援事務和行級鎖,是innodb的最大特色。行鎖大幅度提高了多使用者併發操作的新能。但是InnoDB的行鎖也不是

MySQL資料庫中 InnoDB MyISAM的區別及其應用場景

InnoDB 與 MyISAM 都是MySQL資料庫的引擎。 1.他們的區別分為五點: (1).事務處理: MyISAM是非事務安全型的,而InnoDB是事務安全型的(支援事務處理等) (2).鎖機制不同: MyISAM是

InnoDBMyISAM中的count(*)的執行效率比較

今天同學們在群裡討論oracle的count(*)與count(1)的問題,正好提到mysql的情況。我突然想到自己遇到的問題:在myisam引擎執行count(*)速度非常快,而且執行速度與記錄條數無關,而innodb卻不是這樣,記錄越多,速度越慢。     於是做了一個

InnoDBMyIsAM鎖問題

MyIsAM與InnoDB特點比較MyIsAM   InnoDB儲存限制無限制    64TB   鎖機制   表鎖行鎖、表鎖B樹索引 是   是Hash索引全文索引支援叢集索引不支援支援資料可壓縮   支援不支援空間使用率低   高記憶體使用率低高批量插入速度   高低外來

堵俊平:雲開源——資料引擎的未來

大家好!我是堵俊平,來自Apache社群。我是Apache 基金會的member (會員), 也是 Hadoop 以及 YuniKorn等專案的committer和PMC。 我也是 Tube MQ, Nutx等孵化器專案的導師。在大資料方面有一個長時間的開源貢獻。  首先,我們回顧一下大資料技術

MySQL存儲引擎InnodbMyISAM對比總結

級別 索引 日誌 鎖定 lte mysql 恢復 ins 標準 Innodb引擎 InnoDB是一個事務型的存儲引擎,設計目標是處理大數量數據時提供高性能的服務,它在運行時會在內存中建立緩沖池,用於緩沖數據和索引。 Innodb引擎優點 1.支持事務處

MySQL 更改所有表的資料引擎MyISAM 設定為 InnoDB

一、先設定執行SQL語句: SELECT GROUP_CONCAT(CONCAT( 'ALTER TABLE ' ,TABLE_NAME ,' ENGINE=InnoDB; ') SEPARATOR