Mysql InnoDB還是MyISAM

選擇MyISAM
原文:InnoDB還是MyISAM 再談MySQL存儲引擎的選擇

兩種類型最主要的差別就是Innodb 支持事務(wù)處理與外鍵和行級鎖.而MyISAM不支持.所以MyISAM往往就容易被人認(rèn)為只適合在小項(xiàng)目中使用。
從運(yùn)維角度來說看,要達(dá)到需求:99.9%的穩(wěn)定性,方便的擴(kuò)展性和高可用性來說的話,MyISAM絕對是我的首選。

原因如下:
1、首先我目前平臺上承載的大部分項(xiàng)目是讀多寫少的項(xiàng)目,而MyISAM的讀性能是比Innodb強(qiáng)不少的。
2、MyISAM的索引和數(shù)據(jù)是分開的,并且索引是有壓縮的,內(nèi)存使用率就對應(yīng)提高了不少。能加載更多索引,而Innodb是索引和數(shù)據(jù)是緊密捆綁的,沒有使用壓縮從而會造成Innodb比MyISAM體積龐大不小。
3、從平臺角度來說,經(jīng)常隔1,2個(gè)月就會發(fā)生應(yīng)用開發(fā)人員不小心update一個(gè)表where寫的范圍不對,導(dǎo)致這個(gè)表沒法正常用了,這個(gè)時(shí)候MyISAM的優(yōu)越性就體現(xiàn)出來了,隨便從當(dāng)天拷貝的壓縮包取出對應(yīng)表的文件,隨便放到一個(gè)數(shù)據(jù)庫目錄下,然后dump成sql再導(dǎo)回到主庫,并把對應(yīng)的binlog補(bǔ)上。如果是Innodb,恐怕不可能有這么快速度,別和我說讓Innodb定期用導(dǎo)出xxx.sql機(jī)制備份,因?yàn)槲移脚_上最小的一個(gè)數(shù)據(jù)庫實(shí)例的數(shù)據(jù)量基本都是幾十G大小。
4、從我接觸的應(yīng)用邏輯來說,select count(*) 和order by 是最頻繁的,大概能占了整個(gè)sql總語句的60%以上的操作,而這種操作Innodb其實(shí)也是會鎖表的,很多人以為Innodb是行級鎖,那個(gè)只是where對它主鍵是有效,非主鍵的都會鎖全表的。
5、還有就是經(jīng)常有很多應(yīng)用部門需要我給他們定期某些表的數(shù)據(jù),MyISAM的話很方便,只要發(fā)給他們對應(yīng)那表的frm.MYD,MYI的文件,讓他們自己在對應(yīng)版本的數(shù)據(jù)庫啟動就行,而Innodb就需要導(dǎo)出xxx.sql了,因?yàn)楣饨o別人文件,受字典數(shù)據(jù)文件的影響,對方是無法使用的。
6、如果和MyISAM比insert寫操作的話,Innodb還達(dá)不到MyISAM的寫性能,如果是針對基于索引的update操作,雖然MyISAM可能會遜色I(xiàn)nnodb,但是那么高并發(fā)的寫,從庫能否追的上也是一個(gè)問題,還不如通過多實(shí)例分庫分表架構(gòu)來解決。
7、如果是用MyISAM的話,merge引擎可以大大加快應(yīng)用部門的開發(fā)速度,他們只要對這個(gè)merge表做一些select count(*)操作,非常適合大項(xiàng)目總量約幾億的rows某一類型(如日志,調(diào)查統(tǒng)計(jì))的業(yè)務(wù)表。
當(dāng)然Innodb也不是絕對不用,用事務(wù)的項(xiàng)目如模擬炒股項(xiàng)目,我就是用Innodb的,活躍用戶20多萬時(shí)候,也是很輕松應(yīng)付了,因此我個(gè)人也是很喜歡Innodb的,只是如果從數(shù)據(jù)庫平臺應(yīng)用出發(fā),我還是會首選MyISAM。
另外,可能有人會說你MyISAM無法抗太多寫操作,但是我可以通過架構(gòu)來彌補(bǔ),說個(gè)我現(xiàn)有用的數(shù)據(jù)庫平臺容量:主從數(shù)據(jù)總量在幾百T以上,每天十多億 pv的動態(tài)頁面,還有幾個(gè)大項(xiàng)目是通過數(shù)據(jù)接口方式調(diào)用未算進(jìn)pv總數(shù),(其中包括一個(gè)大項(xiàng)目因?yàn)槌跗趍emcached沒部署,導(dǎo)致單臺數(shù)據(jù)庫每天處理 9千萬的查詢)。而我的整體數(shù)據(jù)庫服務(wù)器平均負(fù)載都在0.5-1左右。

選擇InnoDB
原文:InnoDB還是MyISAM 再談MySQL存儲引擎的選擇
MyISAM 是MySQL中默認(rèn)的存儲引擎,一般來說不是有太多人關(guān)心這個(gè)東西。決定使用什么樣的存儲引擎是一個(gè)很tricky的事情,但是還是值我們?nèi)パ芯恳幌?,這里的文章只考慮 MyISAM 和InnoDB這兩個(gè),因?yàn)檫@兩個(gè)是最常見的。
下面先讓我們回答一些問題:
◆你的數(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ù)的大小,是一個(gè)影響你選擇什么樣存儲引擎的重要因素,大尺寸的數(shù)據(jù)集趨向于選擇InnoDB方式,因?yàn)槠渲С质聞?wù)處理和故障恢復(fù)。數(shù)據(jù)庫的在小決定了故障恢復(fù)的時(shí)間長短,InnoDB可以利用事務(wù)日志進(jìn)行數(shù)據(jù)恢復(fù),這會比較快。而MyISAM可能會需要幾個(gè)小時(shí)甚至幾天來干這些事,InnoDB只需要幾分鐘。
您操作數(shù)據(jù)庫表的習(xí)慣可能也會是一個(gè)對性能影響很大的因素。比如: COUNT() 在 MyISAM 表中會非??欤贗nnoDB 表下可能會很痛苦。而主鍵查詢則在InnoDB下會相當(dāng)相當(dāng)?shù)目欤枰⌒牡氖侨绻覀兊闹麈I太長了也會導(dǎo)致性能問題。大批的inserts 語句在MyISAM下會快一些,但是updates 在InnoDB 下會更快一些——尤其在并發(fā)量大的時(shí)候。
所以,到底你檢使用哪一個(gè)呢?根據(jù)經(jīng)驗(yàn)來看,如果是一些小型的應(yīng)用或項(xiàng)目,那么MyISAM 也許會更適合。當(dāng)然,在大型的環(huán)境下使用MyISAM 也會有很大成功的時(shí)候,但卻不總是這樣的。如果你正在計(jì)劃使用一個(gè)超大數(shù)據(jù)量的項(xiàng)目,而且需要事務(wù)處理或外鍵支持,那么你真的應(yīng)該直接使用InnoDB方式。但需要記住InnoDB 的表需要更多的內(nèi)存和存儲,轉(zhuǎn)換100GB 的MyISAM 表到InnoDB 表可能會讓你有非常壞的體驗(yàn)。

混合使用
原文:PHP與MySQL學(xué)習(xí)筆記8:重要概念與設(shè)計(jì)Web數(shù)據(jù)庫

1、存儲引擎
MySQL支持許多不同的“存儲引擎”,也叫作“表格類型”。每個(gè)表可是使用不同的存儲引擎,而且可以輕松地對它們進(jìn)行轉(zhuǎn)換。
創(chuàng)建表時(shí)可以選擇一個(gè)表格類型:
CREATE TABLE table TYPE = type....
修改表類型:
alter table orders type = innodb;

1)MyISAM,默認(rèn)類型
它基于傳統(tǒng)的ISAM類型,Indexed Sequential Access Method(有索引的順序訪問方法)的縮寫,它是存儲記錄和文件的標(biāo)準(zhǔn)方法。
MyISAM特點(diǎn):
MyISAM具有檢查和修復(fù)表格的大多數(shù)工具,表格可以被壓縮,支持全文搜索。但是它們不是事務(wù)安全的,也不支持外鍵。

2)InnoDB
該類型表是事務(wù)安全的,也就是說,它提供了 COMMIT 和 ROLLBACK功能。InnoDB支持外鍵。 雖然比MyISAM表要慢些,但是如果應(yīng)用程序需要一個(gè)事務(wù)安全的存儲引擎,建議使用。

注:在大多數(shù)Web應(yīng)用程序中,通常都會使用MyISAM或InnoDB表格或者二者的結(jié)合。

**3)MEMORY **(以前的 HEAP
該類型表,存儲在內(nèi)存中,表的索引是哈希分布的。
MEMORY表格運(yùn)行速度非???,但是如果發(fā)生崩潰,數(shù)據(jù)將丟失。
建議:MEMORY表格適合保存臨時(shí)或者派生的數(shù)據(jù),應(yīng)該在CREATE TABLE語句中指定MAX_ROWS,否則這些表可能吞噬所有內(nèi)存。同樣,它們不能加入BLOB、TEXT或AUTO INCREMENT列。

4)MERGE
這些表允許你為了查詢目的,把MyISAM表的集合作為一個(gè)單個(gè)表。因此,你可在某些操作系統(tǒng)中,避開最大文件大小限制。

5)ARCHIVE
這些表保存了大量數(shù)據(jù),但是只有少量腳注(footprint)。這種類型的表只支持INSERT 和SELECT 查詢。不支持DELETE、UPDATE 和 REPLACE。此外,也不使用索引。

6)CSV
這些表保存在服務(wù)器的單個(gè)文件中,它包含用逗號隔離的數(shù)據(jù)。
可以方便地用Excel等第三方工具打開。

建議:
當(dāng)對一個(gè)表格使用大量的SELECT 和 INSERT 語句(或者二者結(jié)合)時(shí),應(yīng)該使用MyISAM 表格,因?yàn)樵趫?zhí)行這兩種命令時(shí),MyISAM是最快的。對于很多Web程序(例如分類)來說,MyISAM是最佳選擇。如果需要全文搜索功能,也應(yīng)該使用MyISAM功能。
當(dāng)事務(wù)非常重要(例如存儲財(cái)務(wù)數(shù)據(jù)),或在INSERT 和 SELECT 語句是交錯(cuò)執(zhí)行的情況下(例如在線的消息欄或論壇系統(tǒng)),應(yīng)該使用 InnoDB。InnoDB在MySQL5.6版本中好像支持全文索引了。

2、事務(wù)
事務(wù)是確保數(shù)據(jù)庫一致的機(jī)制,尤其是在發(fā)生錯(cuò)誤或服務(wù)器崩潰情況下確保數(shù)據(jù)庫一致的機(jī)制。
事務(wù)是一個(gè)或一系列的查詢,這些查詢可以保證能夠在數(shù)據(jù)庫中作為一個(gè)整體全部執(zhí)行或者全部不執(zhí)行。這樣,數(shù)據(jù)庫才能在無論事務(wù)是否完成的情況下保持一致狀態(tài)。
比如,銀行轉(zhuǎn)賬,比如保證從一個(gè)賬戶減少和另一個(gè)賬戶增加的操作完整完成。

ACID原則,就是描述事務(wù)安全性的4個(gè)需求:
Atomicity(原子性)---一個(gè)事務(wù)必須是原子性的,它必須是作為一個(gè)整體完全執(zhí)行或者完全不執(zhí)行。
Consistency(一致性)---一個(gè) 事務(wù)必須能夠使數(shù)據(jù)庫處于一致的狀態(tài)。
Isoltion(孤立性)---未完全完成的 事務(wù)不能被數(shù)據(jù)庫的其他用戶所見,也就是說,在事務(wù)完全完成之前,它們都是孤立的。
Durability(持續(xù)性)---一旦寫入到數(shù)據(jù)庫后,事務(wù)必須是永久的而且持續(xù)的。
注意:一個(gè)事務(wù)被永久地寫入到數(shù)據(jù)庫中稱作該事務(wù)被提交了。一個(gè)沒有寫入到數(shù)據(jù)庫中的事務(wù)(因此數(shù)據(jù)庫將狀態(tài)重置到事務(wù)開始之前的狀態(tài))稱作事務(wù)被回滾了。

3、關(guān)系數(shù)據(jù)庫
關(guān)系數(shù)據(jù)庫代替普通文件的優(yōu)點(diǎn):
1)關(guān)系數(shù)據(jù)庫比普通文件的數(shù)據(jù)訪問速度更快。
2)關(guān)系數(shù)據(jù)庫更容易查詢并提取滿足特定條件的數(shù)據(jù)。
3)關(guān)系數(shù)據(jù)庫具有專門的內(nèi)置機(jī)制處理并發(fā)訪問。
4)關(guān)系數(shù)據(jù)庫可以提供對數(shù)據(jù)的隨機(jī)訪問
5)關(guān)系數(shù)據(jù)庫具有內(nèi)置的權(quán)限系統(tǒng)。

4、關(guān)系數(shù)據(jù)庫的一些基本概念
1)關(guān)系數(shù)據(jù)庫由“關(guān)系”組成,這些關(guān)系通常稱為“表格”


2)列
“列”又叫做“域”或者“屬性”
每一列都有一個(gè)唯一的名稱,和一個(gè)相關(guān)的數(shù)據(jù)類型。
3)行
每一行具有相同的格式,也具有相同的屬性。行也叫“記錄”。
4)值
每個(gè)值必須與該列定義的數(shù)據(jù)類型相同。
5)鍵
我們必須有一個(gè)能夠識別每一個(gè)特定記錄的方法。
表中的標(biāo)志列成為“鍵”或“主鍵”。
數(shù)據(jù)庫由多個(gè)表組成,可以使用鍵作為表格之間的引用。

6)模式
數(shù)據(jù)庫整套表格的完整設(shè)計(jì)稱為數(shù)據(jù)庫的“模式”。它是數(shù)據(jù)庫的設(shè)計(jì)藍(lán)圖。
一個(gè)模式應(yīng)該顯示表格及表格的列、各個(gè)表的主鍵和外鍵。
可以包含示例數(shù)據(jù)來解析這些數(shù)據(jù)的含義。

7)關(guān)系
關(guān)系數(shù)據(jù)庫中有3種基本的關(guān)系類型,一對一、一對多、多對多。

4、設(shè)計(jì)Web數(shù)據(jù)庫
知道什么時(shí)候需要一個(gè)新表,以及需要哪些鍵,需要掌握很高的技巧。但是在大多數(shù)情況下,我們可以遵循一些基本的原則。

1)考慮實(shí)際建模的對象,現(xiàn)實(shí)世界對應(yīng)的對象
2)避免冗余數(shù)據(jù)
冗余數(shù)據(jù)將導(dǎo)致兩個(gè)主要問題:
a. 空間的浪費(fèi)
b. 數(shù)據(jù)更新的不一致,數(shù)據(jù)的完整性將被破壞。(修改、插入和刪除時(shí)容易導(dǎo)致)
c. 使用原子列值:每一行的每個(gè)屬性只存儲一個(gè)數(shù)據(jù)。
如果我們想在格子里存多個(gè)數(shù)據(jù)值,其實(shí)相當(dāng)于創(chuàng)建了一個(gè)表中表,這樣系統(tǒng)就不能只計(jì)算匹配字段了,而必須分析每個(gè)屬性值,看系統(tǒng)中是否包含一個(gè)匹配。所以,看情況而定吧。
d. 選擇有意義的鍵
e. 考慮需要詢問數(shù)據(jù)庫的問題,想一想我們希望數(shù)據(jù)庫回答什么問題,然后確認(rèn)數(shù)據(jù)庫中是否已經(jīng)包含所有需要的數(shù)據(jù),并且在表之間要有適當(dāng)?shù)年P(guān)聯(lián)。
f. 避免多個(gè)空屬性的設(shè)計(jì)。
數(shù)據(jù)庫里有很多空值,很糟糕。首先,浪費(fèi)空間。其次,在統(tǒng)計(jì)列總量或?qū)ζ渌麛?shù)值列應(yīng)用計(jì)算函數(shù)時(shí)可能導(dǎo)致錯(cuò)誤。還有,當(dāng)用戶看到表中一部分為空時(shí)。也很迷惑,他們也不知道是否因?yàn)樵搶傩允菬o關(guān)的,還是數(shù)據(jù)庫中有錯(cuò)誤,或者是數(shù)據(jù)尚未輸入。

5、表類型總結(jié)
1)描述現(xiàn)實(shí)世界對象的簡單表
2)描述兩個(gè)現(xiàn)實(shí)世界對象的多對多關(guān)系的關(guān)聯(lián)表。

6、Web數(shù)據(jù)庫的架構(gòu)

通常,Web服務(wù)器軟件,PHP引擎和數(shù)據(jù)庫服務(wù)器都在同一臺機(jī)器上運(yùn)行。但是數(shù)據(jù)庫服務(wù)器在另外一臺機(jī)器上運(yùn)行也很常見,這樣是出于安全性、提高性能以及負(fù)載均衡的原因。
隨著應(yīng)用程序在大小和復(fù)雜度上不斷增加,我們可能會將PHP應(yīng)用程序分成不同的層,通常,包括與MySQL交互的數(shù)據(jù)庫層、包含了應(yīng)用程序的業(yè)務(wù)邏輯成、管理HTML輸出的表示層。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容