· 先存儲(chǔ)數(shù)據(jù)低字節(jié)并不嚴(yán)重地影響速度;數(shù)據(jù)行中的字節(jié)一般是未聯(lián)合的,從一個(gè)方向讀未聯(lián)合的字節(jié)并不比從反向讀更占用更多的資源。服務(wù)器上的獲取列值的代碼與其它代碼相比并不顯得時(shí)間緊。
· 大文件(達(dá)63位文件長度)在支持大文件的文件系統(tǒng)和操作系統(tǒng)上被支持。
· 當(dāng)把刪除和更新及插入混合的時(shí)候,動(dòng)態(tài)尺寸的行更少碎片。這要通過合并相鄰被刪除的塊,以及若下一個(gè)塊被刪除,就擴(kuò)展到下一塊來自動(dòng)完成。
· 每個(gè)MyISAM表最大索引數(shù)是64。 這可以通過重新編譯來改變。每個(gè)索引最大的列數(shù)是16個(gè)。
· 最大的鍵長度是1000字節(jié)。這也可以通過編譯來改變。對(duì)于鍵長度超過250字節(jié)的情況,一個(gè)超過1024字節(jié)的的鍵塊被用上。
· BLOB和TEXT列可以被索引。
· NULL值被允許在索引的列中。這個(gè)占每個(gè)鍵的0-1個(gè)字節(jié)。
· 所有數(shù)字鍵值以高字節(jié)為先被存儲(chǔ)以允許一個(gè)更高地索引壓縮。
· 當(dāng)記錄以排好序的順序插入(就像你使用一個(gè)AUTO_INCREMENT列之時(shí)),索引樹被劈開以便高節(jié)點(diǎn)僅包含一個(gè)鍵。這改善了索引樹的空間利用率。
· 每表一個(gè)AUTO_INCREMEN列的內(nèi)部處理。MyISAM為INSERT和UPDATE操作自動(dòng)更新這一 列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂?shù)闹当粍h除之后就不能再利用。(當(dāng)AUTO_INCREMENT列被定義為多列索 引的最后一列,可以出現(xiàn)重使用從序列頂部刪除的值的情況 )。AUTO_INCREMENT值可用ALTER TABLE或myisamch來重置。
· 如果數(shù)據(jù)文件中間的表沒有自由塊了,在其它線程從表讀的同時(shí),你可以INSERT新行到表中。(這被認(rèn)識(shí)為并發(fā)操作 )。自由塊的出現(xiàn)是作為刪除行的結(jié)果,或者是用比當(dāng)前內(nèi)容多的數(shù)據(jù)對(duì)動(dòng)態(tài)長度行更新的結(jié)果。當(dāng)所有自由塊被用完(填滿),未來的插入又變成并發(fā)。
· 你可以把數(shù)據(jù)文件和索引文件放在不同目錄,用DATA DIRECTORY和INDEX DIRECTORY選項(xiàng)CREATE TABLE以獲得更高的速度,請(qǐng)參閱13.1.5節(jié),“CREATE TABLE語法”。
· 每個(gè)字符列可以又不同的字符集。
· 在MyISAM索引文件里又一個(gè)標(biāo)志,它表明表是否被正確關(guān)閉。如果用--myisam-recover選項(xiàng)啟動(dòng)mysqld,MyISAM表在打開得時(shí)候被自動(dòng)檢查,如果被表被不恰當(dāng)?shù)仃P(guān)閉,就修復(fù)表。
· 如果你用--update-state選項(xiàng)運(yùn)行myisamchk,它標(biāo)注表為已檢查。myisamchk --fast只檢查那些沒有這個(gè)標(biāo)志的表。
· myisamchk --analyze為部分鍵存儲(chǔ)統(tǒng)計(jì)信息,也為整個(gè)鍵存儲(chǔ)統(tǒng)計(jì)信息。
· myisampack可以打包BLOB和VARCHAR列。
MyISAM也支持下列特征:
· 支持true VARCHAR類型;VARCHAR列以存儲(chǔ)在2個(gè)字節(jié)中的長度來開始。
· 有VARCHAR的表可以有固定或動(dòng)態(tài)記錄長度。
· VARCHAR和CHAR列可以多達(dá)64KB。
· 一個(gè)被搞亂的已計(jì)算索引對(duì)可對(duì)UNIQUE來使用。這允許你在表內(nèi)任何列的合并上有UNIQUE。(盡管如此,你不能在一個(gè)UNIQUE已計(jì)算索引上搜索)。
InnoDB是為處理巨大數(shù)據(jù)量時(shí)的最大性能設(shè)計(jì)。它的CPU效率可能是任何其它基于磁盤的關(guān)系數(shù)據(jù)庫引擎所不能匹敵的。
InnoDB存儲(chǔ)引擎被完全與MySQL服務(wù)器整合,InnoDB存儲(chǔ)引擎為在主內(nèi)存中緩存數(shù)據(jù)和索引而維持它自己的緩沖池。 InnoDB存儲(chǔ)它的表&索引在一個(gè)表空間中,表空間可以包含數(shù)個(gè)文件(或原始磁盤分區(qū))。這與MyISAM表不同,比如在MyISAM表中每個(gè)表被存在 分離的文件中。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上存儲(chǔ)超過1TB的數(shù)據(jù),還有一些其它站點(diǎn)在InnoDB上處理平均每秒800次插入/更新的負(fù)荷。MyISAM 是MySQL中默認(rèn)的存儲(chǔ)引擎,一般來說不是有太多人關(guān)心這個(gè)東西。決定使用什么樣的存儲(chǔ)引擎是一個(gè)很tricky的事情,但是還是值我們?nèi)パ芯恳幌?,這里的文章只考慮 MyISAM 和InnoDB這兩個(gè),因?yàn)檫@兩個(gè)是最常見的。
下面先讓我們回答一些問題:
思考上面這些問題可以讓你找到合適的方向,但那并不是絕對(duì)的。如果你需要事務(wù)處理或是外鍵,那么InnoDB 可能是比較好的方式。如果你需要全文索引,那么通常來說 MyISAM是好的選擇,因?yàn)檫@是系統(tǒng)內(nèi)建的,然而,我們其實(shí)并不會(huì)經(jīng)常地去測試兩百萬行記錄。所以,就算是慢一點(diǎn),我們可以通過使用Sphinx從 InnoDB中獲得全文索引。
數(shù)據(jù)的大小,是一個(gè)影響你選擇什么樣存儲(chǔ)引擎的重要因素,大尺寸的數(shù)據(jù)集趨向于選擇InnoDB方式,因?yàn)槠渲С质聞?wù)處理和故障恢復(fù)。數(shù)據(jù)庫的在小 決定了故障恢復(fù)的時(shí)間長短,InnoDB可以利用事務(wù)日志進(jìn)行數(shù)據(jù)恢復(fù),這會(huì)比較快。而MyISAM可能會(huì)需要幾個(gè)小時(shí)甚至幾天來干這些事,InnoDB 只需要幾分鐘。
您操作數(shù)據(jù)庫表的習(xí)慣可能也會(huì)是一個(gè)對(duì)性能影響很大的因素。比如: COUNT() 在 MyISAM 表中會(huì)非???,而在InnoDB 表下可能會(huì)很痛苦。而主鍵查詢則在InnoDB下會(huì)相當(dāng)相當(dāng)?shù)目欤枰⌒牡氖侨绻覀兊闹麈I太長了也會(huì)導(dǎo)致性能問題。大批的inserts 語句在MyISAM下會(huì)快一些,但是updates 在InnoDB 下會(huì)更快一些——尤其在并發(fā)量大的時(shí)候。
所以,到底你檢使用哪一個(gè)呢?根據(jù)經(jīng)驗(yàn)來看,如果是一些小型的應(yīng)用或項(xiàng)目,那么MyISAM 也許會(huì)更適合。當(dāng)然,在大型的環(huán)境下使用MyISAM 也會(huì)有很大成功的時(shí)候,但卻不總是這樣的。如果你正在計(jì)劃使用一個(gè)超大數(shù)據(jù)量的項(xiàng)目,而且需要事務(wù)處理或外鍵支持,那么你真的應(yīng)該直接使用InnoDB方 式。但需要記住InnoDB 的表需要更多的內(nèi)存和存儲(chǔ),轉(zhuǎn)換100GB 的MyISAM 表到InnoDB 表可能會(huì)讓你有非常壞的體驗(yàn)。
1.InnoDB不支持FULLTEXT類型的索引。
2.InnoDB 中不保存表的具體行數(shù),也就是說,執(zhí)行select count(*) from table時(shí),InnoDB要掃描一遍整個(gè)表來計(jì)算有多少行,但是MyISAM只要簡單的讀出保存好的行數(shù)即可。注意的是,當(dāng)count(*)語句包含 where條件時(shí),兩種表的操作是一樣的。
3.對(duì)于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引。
4.DELETE FROM table時(shí),InnoDB不會(huì)重新建立表,而是一行一行的刪除。
5.LOAD TABLE FROM MASTER操作對(duì)InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對(duì)于使用的額外的InnoDB特性(例如外鍵)的表不適用。
另外,InnoDB表的行鎖也不是絕對(duì)的,如果在執(zhí)行一個(gè)SQL語句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表,例如update table set num=1 where name like “%aaa%”
聯(lián)系客服