欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談MySQL存儲引擎選擇 InnoDB與MyISAM的優(yōu)缺點(diǎn)分析

 更新時間:2013年06月08日 16:51:17   作者:  
MyISAM 是MySQL中默認(rèn)的存儲引擎,一般來說不是有太多人關(guān)心這個東西。決定使用什么樣的存儲引擎是一個很tricky的事情,但是還是值我們?nèi)パ芯恳幌?,這里的文章只考慮 MyISAM 和InnoDB這兩個,因?yàn)檫@兩個是最常見的
下面先讓我們回答一些問題:

◆你的數(shù)據(jù)庫有外鍵嗎?
◆你需要事務(wù)支持嗎?
◆你需要全文索引嗎?
◆你經(jīng)常使用什么樣的查詢模式?
◆你的數(shù)據(jù)有多大?

思考上面這些問題可以讓你找到合適的方向,但那并不是絕對的。如果你需要事務(wù)處理或是外鍵,那么InnoDB 可能是比較好的方式。如果你需要全文索引,那么通常來說 MyISAM是好的選擇,因?yàn)檫@是系統(tǒng)內(nèi)建的,然而,我們其實(shí)并不會經(jīng)常地去測試兩百萬行記錄。所以,就算是慢一點(diǎn),我們可以通過使用Sphinx從InnoDB中獲得全文索引。

數(shù)據(jù)的大小,是一個影響你選擇什么樣存儲引擎的重要因素,大尺寸的數(shù)據(jù)集趨向于選擇InnoDB方式,因?yàn)槠渲С质聞?wù)處理和故障恢復(fù)。數(shù)據(jù)庫的在小決定了故障恢復(fù)的時間長短,InnoDB可以利用事務(wù)日志進(jìn)行數(shù)據(jù)恢復(fù),這會比較快。而MyISAM可能會需要幾個小時甚至幾天來干這些事,InnoDB只需要幾分鐘。

您操作數(shù)據(jù)庫表的習(xí)慣可能也會是一個對性能影響很大的因素。比如: COUNT() 在 MyISAM 表中會非???,而在InnoDB 表下可能會很痛苦。而主鍵查詢則在InnoDB下會相當(dāng)相當(dāng)?shù)目?,但需要小心的是如果我們的主鍵太長了也會導(dǎo)致性能問題。大批的inserts 語句在MyISAM下會快一些,但是updates 在InnoDB 下會更快一些——尤其在并發(fā)量大的時候。

所以,到底你檢使用哪一個呢?根據(jù)經(jīng)驗(yàn)來看,如果是一些小型的應(yīng)用或項(xiàng)目,那么MyISAM 也許會更適合。當(dāng)然,在大型的環(huán)境下使用MyISAM 也會有很大成功的時候,但卻不總是這樣的。如果你正在計劃使用一個超大數(shù)據(jù)量的項(xiàng)目,而且需要事務(wù)處理或外鍵支持,那么你真的應(yīng)該直接使用InnoDB方式。但需要記住InnoDB 的表需要更多的內(nèi)存和存儲,轉(zhuǎn)換100GB 的MyISAM 表到InnoDB 表可能會讓你有非常壞的體驗(yàn)。

MyISAM存儲引擎

MyISAM是 默認(rèn)存儲引擎。它基于更老的ISAM代碼,但有很多有用的擴(kuò)展。MyISAM存儲引擎的一些特征:

●所有數(shù)據(jù)值先存儲低字節(jié)。這使得數(shù)據(jù)機(jī)和操作系統(tǒng)分離。二進(jìn)制輕便性的唯一要求是機(jī)器使用補(bǔ)碼(如最近20年的機(jī)器有的一樣)和IEEE浮點(diǎn)格式(在主流機(jī)器中也完全是主導(dǎo)的)。唯一不支持二進(jìn)制兼容性的機(jī)器是嵌入式系統(tǒng)。這些系統(tǒng)有時使用特殊的處理器。
●先存儲數(shù)據(jù)低字節(jié)并不嚴(yán)重地影響速度;數(shù)據(jù)行中的字節(jié)一般是未聯(lián)合的,從一個方向讀未聯(lián)合的字節(jié)并不比從反向讀更占用更多的資源。服務(wù)器上的獲取列值的代碼與其它代碼相比并不顯得時間緊。
●大文件(達(dá)63位文件長度)在支持大文件的文件系統(tǒng)和操作系統(tǒng)上被支持。
●當(dāng)把刪除和更新及插入混合的時候,動態(tài)尺寸的行更少碎片。這要通過合并相鄰被刪除的塊,以及若下一個塊被刪除,就擴(kuò)展到下一塊來自動完成。
●每個MyISAM表最大索引數(shù)是64。 這可以通過重新編譯來改變。每個索引最大的列數(shù)是16個。
●最大的鍵長度是1000字節(jié)。這也可以通過編譯來改變。對于鍵長度超過250字節(jié)的情況,一個超過1024字節(jié)的的鍵塊被用上。
●BLOB和TEXT列可以被索引。
●NULL值被允許在索引的列中。這個占每個鍵的0-1個字節(jié)。
●所有數(shù)字鍵值以高字節(jié)為先被存儲以允許一個更高地索引壓縮。
●當(dāng)記錄以排好序的順序插入(就像你使用一個AUTO_INCREMENT列之時),索引樹被劈開以便高節(jié)點(diǎn)僅包含一個鍵。這改善了索引樹的空間利用率。
●每表一個AUTO_INCREMEN列的內(nèi)部處理。MyISAM為INSERT和UPDATE操作自動更新這一 列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂?shù)闹当粍h除之后就不能再利用。(當(dāng)AUTO_INCREMENT列被定義為多列索 引的最后一列,可以出現(xiàn)重使用從序列頂部刪除的值的情況 )。AUTO_INCREMENT值可用ALTER TABLE或myisamch來重置。
●如果數(shù)據(jù)文件中間的表沒有自由塊了,在其它線程從表讀的同時,你可以INSERT新行到表中。(這被認(rèn)識為并發(fā)操作 )。自由塊的出現(xiàn)是作為刪除行的結(jié)果,或者是用比當(dāng)前內(nèi)容多的數(shù)據(jù)對動態(tài)長度行更新的結(jié)果。當(dāng)所有自由塊被用完(填滿),未來的插入又變成并發(fā)。
●你可以把數(shù)據(jù)文件和索引文件放在不同目錄,用DATA DIRECTORY和INDEX DIRECTORY選項(xiàng)CREATE TABLE以獲得更高的速度,請參閱13.1.5節(jié),“CREATE TABLE語法”。
●每個字符列可以又不同的字符集。
●在MyISAM索引文件里又一個標(biāo)志,它表明表是否被正確關(guān)閉。如果用--myisam-recover選項(xiàng)啟動mysqld,MyISAM表在打開得時候被自動檢查,如果被表被不恰當(dāng)?shù)仃P(guān)閉,就修復(fù)表。
●如果你用--update-state選項(xiàng)運(yùn)行myisamchk,它標(biāo)注表為已檢查。myisamchk --fast只檢查那些沒有這個標(biāo)志的表。
●myisamchk --analyze為部分鍵存儲統(tǒng)計信息,也為整個鍵存儲統(tǒng)計信息。
●myisampack可以打包BLOB和VARCHAR列。

MyISAM也支持下列特征:

●支持true VARCHAR類型;VARCHAR列以存儲在2個字節(jié)中的長度來開始。
●有VARCHAR的表可以有固定或動態(tài)記錄長度。
●VARCHAR和CHAR列可以多達(dá)64KB。
●一個被搞亂的已計算索引對可對UNIQUE來使用。這允許你在表內(nèi)任何列的合并上有UNIQUE。(盡管如此,你不能在一個UNIQUE已計算索引上搜索)。

InnoDB存儲引擎

InnoDB給MySQL提供 了具有提交,回滾和崩潰恢復(fù)能力的事務(wù)安全(ACID兼容)存儲引擎。InnoDB鎖定在行級并且也在SELECT語句提供一個Oracle風(fēng)格一致的非 鎖定讀。這些特色增加 了多用戶部署和性能。沒有在InnoDB中擴(kuò)大鎖定的需要,因?yàn)樵贗nnoDB中行級鎖定適合非常小的空間。InnoDB也支持FOREIGN KEY強(qiáng)制。在SQL查詢中,你可以自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也可以混合。
InnoDB是為處理巨大數(shù)據(jù)量時的最大性能設(shè)計。它的CPU效率可能是任何其它基于磁盤的關(guān)系數(shù)據(jù)庫引擎所不能匹敵的。
InnoDB存儲引擎被完全與MySQL服務(wù)器整合,InnoDB存儲引擎為在主內(nèi)存中緩存數(shù)據(jù)和索引而維持它自己的緩沖池。 InnoDB存儲它的表&索引在一個表空間中,表空間可以包含數(shù)個文件(或原始磁盤分區(qū))。這與MyISAM表不同,比如在MyISAM表中每個表被存在 分離的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統(tǒng)上。
InnoDB默認(rèn)地被包含在MySQL二進(jìn)制分發(fā)中。Windows Essentials installer使InnoDB成為Windows上MySQL的 默認(rèn)表。
InnoDB被用來在眾多需要高性能的大型數(shù)據(jù)庫站點(diǎn)上產(chǎn)生。著名的Internet新聞?wù)军c(diǎn)Slashdot.org運(yùn)行在 InnoDB上。Mytrix, Inc.在InnoDB上存儲超過1TB的數(shù)據(jù),還有一些其它站點(diǎn)在InnoDB上處理平均每秒800次插入/更新的負(fù)荷。

InnoDB和MyISAM的區(qū)別

區(qū)別概述:

MyISAM 是MySQL中默認(rèn)的存儲引擎,一般來說不是有太多人關(guān)心這個東西。決定使用什么樣的存儲引擎是一個很tricky的事情,但是還是值我們?nèi)パ芯恳幌拢@里的文章只考慮 MyISAM 和InnoDB這兩個,因?yàn)檫@兩個是最常見的。
下面先讓我們回答一些問題:

你的數(shù)據(jù)庫有外鍵嗎?
你需要事務(wù)支持嗎?
你需要全文索引嗎?
你經(jīng)常使用什么樣的查詢模式?
你的數(shù)據(jù)有多大?

思考上面這些問題可以讓你找到合適的方向,但那并不是絕對的。如果你需要事務(wù)處理或是外鍵,那么InnoDB 可能是比較好的方式。如果你需要全文索引,那么通常來說 MyISAM是好的選擇,因?yàn)檫@是系統(tǒng)內(nèi)建的,然而,我們其實(shí)并不會經(jīng)常地去測試兩百萬行記錄。所以,就算是慢一點(diǎn),我們可以通過使用Sphinx從 InnoDB中獲得全文索引。
數(shù)據(jù)的大小,是一個影響你選擇什么樣存儲引擎的重要因素,大尺寸的數(shù)據(jù)集趨向于選擇InnoDB方式,因?yàn)槠渲С质聞?wù)處理和故障恢復(fù)。數(shù)據(jù)庫的在小 決定了故障恢復(fù)的時間長短,InnoDB可以利用事務(wù)日志進(jìn)行數(shù)據(jù)恢復(fù),這會比較快。而MyISAM可能會需要幾個小時甚至幾天來干這些事,InnoDB 只需要幾分鐘。
您操作數(shù)據(jù)庫表的習(xí)慣可能也會是一個對性能影響很大的因素。比如: COUNT() 在 MyISAM 表中會非??欤贗nnoDB 表下可能會很痛苦。而主鍵查詢則在InnoDB下會相當(dāng)相當(dāng)?shù)目?,但需要小心的是如果我們的主鍵太長了也會導(dǎo)致性能問題。大批的inserts 語句在MyISAM下會快一些,但是updates 在InnoDB 下會更快一些——尤其在并發(fā)量大的時候。
所以,到底你檢使用哪一個呢?根據(jù)經(jīng)驗(yàn)來看,如果是一些小型的應(yīng)用或項(xiàng)目,那么MyISAM 也許會更適合。當(dāng)然,在大型的環(huán)境下使用MyISAM 也會有很大成功的時候,但卻不總是這樣的。如果你正在計劃使用一個超大數(shù)據(jù)量的項(xiàng)目,而且需要事務(wù)處理或外鍵支持,那么你真的應(yīng)該直接使用InnoDB方 式。但需要記住InnoDB 的表需要更多的內(nèi)存和存儲,轉(zhuǎn)換100GB 的MyISAM 表到InnoDB 表可能會讓你有非常壞的體驗(yàn)。

區(qū)別總結(jié):

1.InnoDB不支持FULLTEXT類型的索引。
2.InnoDB 中不保存表的具體行數(shù),也就是說,執(zhí)行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數(shù)即可。注意的是,當(dāng)count(*)語句包含 where條件時,兩種表的操作是一樣的。
3.對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引。
4.DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。
5.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用。
另外,InnoDB表的行鎖也不是絕對的,如果在執(zhí)行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%”

提升InnoDB性能的方法:
MyISAM和InnoDB存儲引擎性能差別并不是很大,針對InnoDB來說,影響性能的主要是 innodb_flush_log_at_trx_commit 這個選項(xiàng),如果設(shè)置為1的話,那么每次插入數(shù)據(jù)的時候都會自動提交,導(dǎo)致性能急劇下降,應(yīng)該是跟刷新日志有關(guān)系,設(shè)置為0效率能夠看到明顯提升,當(dāng)然,同 樣你可以SQL中提交“SET AUTOCOMMIT = 0”來設(shè)置達(dá)到好的性能。另外,還聽說通過設(shè)置innodb_buffer_pool_size能夠提升InnoDB的性能,但是我測試發(fā)現(xiàn)沒有特別明顯 的提升。
基本上我們可以考慮使用InnoDB來替代我們的MyISAM引擎了,因?yàn)镮nnoDB自身很多良好的特點(diǎn),比如事務(wù)支持、存儲 過程、視圖、行級鎖定等等,在并發(fā)很多的情況下,相信InnoDB的表現(xiàn)肯定要比MyISAM強(qiáng)很多,當(dāng)然,相應(yīng)的在my.cnf中的配置也是比較關(guān)鍵 的,良好的配置,能夠有效的加速你的應(yīng)用。
任何一種表都不是萬能的,只用恰當(dāng)?shù)尼槍I(yè)務(wù)類型來選擇合適的表類型,才能最大的發(fā)揮MySQL的性能優(yōu)勢。

相關(guān)文章

最新評論