五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > mysql存儲(chǔ)引擎 MyISAM 和 InnoDB 的區(qū)別及用法

mysql存儲(chǔ)引擎 MyISAM 和 InnoDB 的區(qū)別及用法

文章來(lái)源:365jz.com     點(diǎn)擊數(shù):416    更新時(shí)間:2021-04-24 23:18   參與評(píng)論

InnoDB和MyISAM是很多人在使用MySQL時(shí)最常用的兩個(gè)表類(lèi)型,這兩個(gè)表類(lèi)型各有優(yōu)劣,5.7之后就不一樣了

1、事務(wù)和外鍵

InnoDB具有事務(wù),支持4個(gè)事務(wù)隔離級(jí)別,回滾,崩潰修復(fù)能力和多版本并發(fā)的事務(wù)安全,包括ACID。如果應(yīng)用中需要執(zhí)行大量的INSERT或UPDATE操作,則應(yīng)該使用InnoDB,這樣可以提高多用戶并發(fā)操作的性能

MyISAM管理非事務(wù)表。它提供高速存儲(chǔ)和檢索,以及全文搜索能力。如果應(yīng)用中需要執(zhí)行大量的SELECT查詢,那么MyISAM是更好的選擇

2、全文索引

Innodb不支持全文索引,如果一定要用的話,最好使用sphinx等搜索引擎。myisam對(duì)中文支持的不是很好

不過(guò)新版本的Innodb已經(jīng)支持了

3、鎖

mysql支持三種鎖定級(jí)別,行級(jí)、頁(yè)級(jí)、表級(jí);

MyISAM支持表級(jí)鎖定,提供與 Oracle 類(lèi)型一致的不加鎖讀取(non-locking read in SELECTs)

InnoDB支持行級(jí)鎖,InnoDB表的行鎖也不是絕對(duì)的,如果在執(zhí)行一個(gè)SQL語(yǔ)句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表,注意間隙鎖的影響

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

4、存儲(chǔ)

MyISAM在磁盤(pán)上存儲(chǔ)成三個(gè)文件。第一個(gè)文件的名字以表的名字開(kāi)始,擴(kuò)展名指出文件類(lèi)型, .frm文件存儲(chǔ)表定義,數(shù)據(jù)文件的擴(kuò)展名為.MYD,  索引文件的擴(kuò)展名是.MYI

InnoDB,基于磁盤(pán)的資源是InnoDB表空間數(shù)據(jù)文件和它的日志文件,InnoDB 表的大小只受限于操作系統(tǒng)文件的大小

注意:MyISAM表是保存成文件的形式,在跨平臺(tái)的數(shù)據(jù)轉(zhuǎn)移中使用MyISAM存儲(chǔ)會(huì)省去不少的麻煩

5、索引

InnoDB(索引組織表)使用的聚簇索引、索引就是數(shù)據(jù),順序存儲(chǔ),因此能緩存索引,也能緩存數(shù)據(jù)

MyISAM(堆組織表)使用的是非聚簇索引、索引和文件分開(kāi),隨機(jī)存儲(chǔ),只能緩存索引

6、并發(fā)

MyISAM讀寫(xiě)互相阻塞:不僅會(huì)在寫(xiě)入的時(shí)候阻塞讀取,MyISAM還會(huì)在讀取的時(shí)候阻塞寫(xiě)入,但讀本身并不會(huì)阻塞另外的讀

InnoDB 讀寫(xiě)阻塞與事務(wù)隔離級(jí)別相關(guān)

7、場(chǎng)景選擇

MyISAM

  • 不需要事務(wù)支持(不支持)

  • 并發(fā)相對(duì)較低(鎖定機(jī)制問(wèn)題)

  • 數(shù)據(jù)修改相對(duì)較少(阻塞問(wèn)題),以讀為主

  • 數(shù)據(jù)一致性要求不是非常高

  1. 盡量索引(緩存機(jī)制)

  2. 調(diào)整讀寫(xiě)優(yōu)先級(jí),根據(jù)實(shí)際需求確保重要操作更優(yōu)先

  3. 啟用延遲插入改善大批量寫(xiě)入性能

  4. 盡量順序操作讓insert數(shù)據(jù)都寫(xiě)入到尾部,減少阻塞

  5. 分解大的操作,降低單個(gè)操作的阻塞時(shí)間

  6. 降低并發(fā)數(shù),某些高并發(fā)場(chǎng)景通過(guò)應(yīng)用來(lái)進(jìn)行排隊(duì)機(jī)制

  7. 對(duì)于相對(duì)靜態(tài)的數(shù)據(jù),充分利用Query Cache可以極大的提高訪問(wèn)效率

  8. MyISAM的Count只有在全表掃描的時(shí)候特別高效,帶有其他條件的count都需要進(jìn)行實(shí)際的數(shù)據(jù)訪問(wèn)

InnoDB 

  • 需要事務(wù)支持(具有較好的事務(wù)特性)

  • 行級(jí)鎖定對(duì)高并發(fā)有很好的適應(yīng)能力,但需要確保查詢是通過(guò)索引完成

  • 數(shù)據(jù)更新較為頻繁的場(chǎng)景

  • 數(shù)據(jù)一致性要求較高

  • 硬件設(shè)備內(nèi)存較大,可以利用InnoDB較好的緩存能力來(lái)提高內(nèi)存利用率,盡可能減少磁盤(pán) IO

  1. 主鍵盡可能小,避免給Secondary index帶來(lái)過(guò)大的空間負(fù)擔(dān)

  2. 避免全表掃描,因?yàn)闀?huì)使用表鎖

  3. 盡可能緩存所有的索引和數(shù)據(jù),提高響應(yīng)速度

  4. 在大批量小插入的時(shí)候,盡量自己控制事務(wù)而不要使用autocommit自動(dòng)提交

  5. 合理設(shè)置innodb_flush_log_at_trx_commit參數(shù)值,不要過(guò)度追求安全性

  6. 避免主鍵更新,因?yàn)檫@會(huì)帶來(lái)大量的數(shù)據(jù)移動(dòng)

8、其它細(xì)節(jié)

1)InnoDB 中不保存表的具體行數(shù),注意的是,當(dāng)count(*)語(yǔ)句包含 where條件時(shí),兩種表的操作是一樣的

2)對(duì)于AUTO_INCREMENT類(lèi)型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引, 如果你為一個(gè)表指定AUTO_INCREMENT列,在數(shù)據(jù)詞典里的InnoDB表句柄包含一個(gè)名為自動(dòng)增長(zhǎng)計(jì)數(shù)器的計(jì)數(shù)器,它被用在為該列賦新值。自動(dòng)增長(zhǎng)計(jì)數(shù)器僅被存儲(chǔ)在主內(nèi)存中,而不是存在磁盤(pán)

3)DELETE FROM table時(shí),InnoDB不會(huì)重新建立表,而是一行一行的刪除

4)LOAD TABLE FROM MASTER操作對(duì)InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對(duì)于使用的額外的InnoDB特性(例如外鍵)的表不適用

5)如果執(zhí)行大量的SELECT,MyISAM是更好的選擇,如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應(yīng)該使用InnoDB表

7、為什么MyISAM會(huì)比Innodb 的查詢速度快

InnoDB 在做SELECT的時(shí)候,要維護(hù)的東西比MYISAM引擎多很多;

1)InnoDB 要緩存數(shù)據(jù)和索引,MyISAM只緩存索引塊,這中間還有換進(jìn)換出的減少

2)innodb尋址要映射到塊,再到行,MyISAM記錄的直接是文件的OFFSET,定位比INNODB要快

3)InnoDB 還需要維護(hù)MVCC一致;雖然你的場(chǎng)景沒(méi)有,但他還是需要去檢查和維護(hù)

MVCC ( Multi-Version Concurrency Control )多版本并發(fā)控制

InnoDB :通過(guò)為每一行記錄添加兩個(gè)額外的隱藏的值來(lái)實(shí)現(xiàn)MVCC,這兩個(gè)值一個(gè)記錄這行數(shù)據(jù)何時(shí)被創(chuàng)建,另外一個(gè)記錄這行數(shù)據(jù)何時(shí)過(guò)期(或者被刪除)。但是InnoDB并不存儲(chǔ)這些事件發(fā)生時(shí)的實(shí)際時(shí)間,相反它只存儲(chǔ)這些事件發(fā)生時(shí)的系統(tǒng)版本號(hào)。這是一個(gè)隨著事務(wù)的創(chuàng)建而不斷增長(zhǎng)的數(shù)字。每個(gè)事務(wù)在事務(wù)開(kāi)始時(shí)會(huì)記錄它自己的系統(tǒng)版本號(hào)。每個(gè)查詢必須去檢查每行數(shù)據(jù)的版本號(hào)與事務(wù)的版本號(hào)是否相同。讓我們來(lái)看看當(dāng)隔離級(jí)別是REPEATABLE READ時(shí)這種策略是如何應(yīng)用到特定的操作的

SELECT InnoDB必須每行數(shù)據(jù)來(lái)保證它符合兩個(gè)條件

1、InnoDB必須找到一個(gè)行的版本,它至少要和事務(wù)的版本一樣老(也即它的版本號(hào)不大于事務(wù)的版本號(hào))。這保證了不管是事務(wù)開(kāi)始之前,或者事務(wù)創(chuàng)建時(shí),或者修改了這行數(shù)據(jù)的時(shí)候,這行數(shù)據(jù)是存在的。

2、這行數(shù)據(jù)的刪除版本必須是未定義的或者比事務(wù)版本要大。這可以保證在事務(wù)開(kāi)始之前這行數(shù)據(jù)沒(méi)有被刪除。

8、mysql性能討論

MyISAM最為人垢病的缺點(diǎn)就是缺乏事務(wù)的支持

InnoDB 的磁盤(pán)性能很令人擔(dān)心

MySQL 缺乏良好的 tablespace 



兩種類(lèi)型最主要的差別就是Innodb 支持事務(wù)處理與外鍵和行級(jí)鎖.而MyISAM不支持.所以MyISAM往往就容易被人認(rèn)為只適合在小項(xiàng)目中使用。

我作為使用MySQL的用戶角度出發(fā),Innodb和MyISAM都是比較喜歡的,但是從我目前運(yùn)維的數(shù)據(jù)庫(kù)平臺(tái)要達(dá)到需求:99.9%的穩(wěn)定性,方便的擴(kuò)展性和高可用性來(lái)說(shuō)的話,MyISAM絕對(duì)是我的首選。

原因如下:

1、首先我目前平臺(tái)上承載的大部分項(xiàng)目是讀多寫(xiě)少的項(xiàng)目,而MyISAM的讀性能是比Innodb強(qiáng)不少的。

2、MyISAM的索引和數(shù)據(jù)是分開(kāi)的,并且索引是有壓縮的,內(nèi)存使用率就對(duì)應(yīng)提高了不少。能加載更多索引,而Innodb是索引和數(shù)據(jù)是緊密捆綁的,沒(méi)有使用壓縮從而會(huì)造成Innodb比MyISAM體積龐大不小。

3、從平臺(tái)角度來(lái)說(shuō),經(jīng)常隔1,2個(gè)月就會(huì)發(fā)生應(yīng)用開(kāi)發(fā)人員不小心update一個(gè)表where寫(xiě)的范圍不對(duì),導(dǎo)致這個(gè)表沒(méi)法正常用了,這個(gè)時(shí)候MyISAM的優(yōu)越性就體現(xiàn)出來(lái)了,隨便從當(dāng)天拷貝的壓縮包取出對(duì)應(yīng)表的文件,隨便放到一個(gè)數(shù)據(jù)庫(kù)目錄下,然后dump成sql再導(dǎo)回到主庫(kù),并把對(duì)應(yīng)的binlog補(bǔ)上。如果是Innodb,恐怕不可能有這么快速度,別和我說(shuō)讓Innodb定期用導(dǎo)出xxx.sql機(jī)制備份,因?yàn)槲移脚_(tái)上最小的一個(gè)數(shù)據(jù)庫(kù)實(shí)例的數(shù)據(jù)量基本都是幾十G大小。

4、從我接觸的應(yīng)用邏輯來(lái)說(shuō),select count(*) 和order by 是最頻繁的,大概能占了整個(gè)sql總語(yǔ)句的60%以上的操作,而這種操作Innodb其實(shí)也是會(huì)鎖表的,很多人以為Innodb是行級(jí)鎖,那個(gè)只是where對(duì)它主鍵是有效,非主鍵的都會(huì)鎖全表的。

5、還有就是經(jīng)常有很多應(yīng)用部門(mén)需要我給他們定期某些表的數(shù)據(jù),MyISAM的話很方便,只要發(fā)給他們對(duì)應(yīng)那表的frm.MYD,MYI的文件,讓他們自己在對(duì)應(yīng)版本的數(shù)據(jù)庫(kù)啟動(dòng)就行,而Innodb就需要導(dǎo)出xxx.sql了,因?yàn)楣饨o別人文件,受字典數(shù)據(jù)文件的影響,對(duì)方是無(wú)法使用的。

6、如果和MyISAM比insert寫(xiě)操作的話,Innodb還達(dá)不到MyISAM的寫(xiě)性能,如果是針對(duì)基于索引的update操作,雖然MyISAM可能會(huì)遜色I(xiàn)nnodb,但是那么高并發(fā)的寫(xiě),從庫(kù)能否追的上也是一個(gè)問(wèn)題,還不如通過(guò)多實(shí)例分庫(kù)分表架構(gòu)來(lái)解決。

7、如果是用MyISAM的話,merge引擎可以大大加快應(yīng)用部門(mén)的開(kāi)發(fā)速度,他們只要對(duì)這個(gè)merge表做一些select count(*)操作,非常適合大項(xiàng)目總量約幾億的rows某一類(lèi)型(如日志,調(diào)查統(tǒng)計(jì))的業(yè)務(wù)表。

當(dāng)然Innodb也不是絕對(duì)不用,用事務(wù)的項(xiàng)目如模擬炒股項(xiàng)目,我就是用Innodb的,活躍用戶20多萬(wàn)時(shí)候,也是很輕松應(yīng)付了,因此我個(gè)人也是很喜歡Innodb的,只是如果從數(shù)據(jù)庫(kù)平臺(tái)應(yīng)用出發(fā),我還是會(huì)首選MyISAM。

另外,可能有人會(huì)說(shuō)你MyISAM無(wú)法抗太多寫(xiě)操作,但是我可以通過(guò)架構(gòu)來(lái)彌補(bǔ),說(shuō)個(gè)我現(xiàn)有用的數(shù)據(jù)庫(kù)平臺(tái)容量:主從數(shù)據(jù)總量在幾百T以上,每天十多億 pv的動(dòng)態(tài)頁(yè)面,還有幾個(gè)大項(xiàng)目是通過(guò)數(shù)據(jù)接口方式調(diào)用未算進(jìn)pv總數(shù),(其中包括一個(gè)大項(xiàng)目因?yàn)槌跗趍emcached沒(méi)部署,導(dǎo)致單臺(tái)數(shù)據(jù)庫(kù)每天處理 9千萬(wàn)的查詢)。而我的整體數(shù)據(jù)庫(kù)服務(wù)器平均負(fù)載都在0.5-1左右。

總結(jié)

在數(shù)據(jù)庫(kù)開(kāi)發(fā)中,了解不同存儲(chǔ)引擎的索引實(shí)現(xiàn)方式對(duì)于正確使用和優(yōu)化索引都非常有幫助。例如,知道了InnoDB的索引實(shí)現(xiàn)后,就很容易明白為什么不建議使用過(guò)長(zhǎng)的字段作為主鍵,因?yàn)樗休o助索引都引用主索引,過(guò)長(zhǎng)的主索引會(huì)令輔助索引變得過(guò)大。再例如,用非單調(diào)的字段作為主鍵在InnoDB中不是個(gè)好做法,因?yàn)镮nnoDB數(shù)據(jù)文件本身是一顆B+Tree,非單調(diào)的主鍵會(huì)造成在插入新記錄時(shí)數(shù)據(jù)文件為了維持B+Tree的特性而頻繁的分裂調(diào)整,十分低效,而使用自增字段作為主鍵則是一個(gè)很好的選擇。


區(qū)別:

1. InnoDB 支持事務(wù),MyISAM 不支持事務(wù)。這是 MySQL 將默認(rèn)存儲(chǔ)引擎從 MyISAM 變成 InnoDB 的重要原因之一;

2. InnoDB 支持外鍵,而 MyISAM 不支持。對(duì)一個(gè)包含外鍵的 InnoDB 表轉(zhuǎn)為 MYISAM 會(huì)失?。?/p>

3. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主鍵索引的葉子節(jié)點(diǎn)上,因此 InnoDB 必須要有主鍵,通過(guò)主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然后再通過(guò)主鍵查詢到數(shù)據(jù)。因此,主鍵不應(yīng)該過(guò)大,因?yàn)橹麈I太大,其他索引也都會(huì)很大。而 MyISAM 是非聚集索引,數(shù)據(jù)文件是分離的,索引保存的是數(shù)據(jù)文件的指針。主鍵索引和輔助索引是獨(dú)立的。

4. InnoDB 不保存表的具體行數(shù),執(zhí)行 select count(*) from table 時(shí)需要全表掃描。而MyISAM 用一個(gè)變量保存了整個(gè)表的行數(shù),執(zhí)行上述語(yǔ)句時(shí)只需要讀出該變量即可,速度很快;

5. InnoDB 最小的鎖粒度是行鎖,MyISAM 最小的鎖粒度是表鎖。一個(gè)更新語(yǔ)句會(huì)鎖住整張表,導(dǎo)致其他查詢和更新都會(huì)被阻塞,因此并發(fā)訪問(wèn)受限。這也是 MySQL 將默認(rèn)存儲(chǔ)引擎從 MyISAM 變成 InnoDB 的重要原因之一;

如何選擇:

1. 是否要支持事務(wù),如果要請(qǐng)選擇 InnoDB,如果不需要可以考慮 MyISAM;

2. 如果表中絕大多數(shù)都只是讀查詢,可以考慮 MyISAM,如果既有讀寫(xiě)也挺頻繁,請(qǐng)使用InnoDB。

3. 系統(tǒng)奔潰后,MyISAM恢復(fù)起來(lái)更困難,能否接受,不能接受就選 InnoDB;

4. MySQL5.5版本開(kāi)始Innodb已經(jīng)成為Mysql的默認(rèn)引擎(之前是MyISAM),說(shuō)明其優(yōu)勢(shì)是有目共睹的。如果你不知道用什么存儲(chǔ)引擎,那就用InnoDB,至少不會(huì)差。


比較常用的是 MyISAM 和 InnoBD


  MyISAM

  
  InnoDB

  
  構(gòu)成上的區(qū)別:

  
  每個(gè)MyISAM在磁盤(pán)上存儲(chǔ)成三個(gè)文件。第一個(gè)文件的名字以表的名字開(kāi)始,擴(kuò)展名指出文件類(lèi)型。

  .frm文件存儲(chǔ)表定義。

  數(shù)據(jù)文件的擴(kuò)展名為.MYD (MYData)。

  索引文件的擴(kuò)展名是.MYI (MYIndex)。

  
  基于磁盤(pán)的資源是InnoDB表空間數(shù)據(jù)文件和它的日志文件,InnoDB 表的大小只受限于操作系統(tǒng)文件的大小,一般為 2GB
  
  事務(wù)處理上方面:

  
  MyISAM類(lèi)型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類(lèi)型更快,但是不提供事務(wù)支持

  
  InnoDB提供事務(wù)支持事務(wù),外部鍵(foreign key)等高級(jí)數(shù)據(jù)庫(kù)功能

  
  SELECT   UPDATE,INSERT,Delete操作
  
  如果執(zhí)行大量的SELECT,MyISAM是更好的選擇

  
  1.如果你的數(shù)據(jù)執(zhí)行大量的INSERTUPDATE,出于性能方面的考慮,應(yīng)該使用InnoDB表

  2.DELETE   FROM table時(shí),InnoDB不會(huì)重新建立表,而是一行一行的刪除。

  3.LOAD   TABLE FROM MASTER操作對(duì)InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對(duì)于使用的額外的InnoDB特性(例如外鍵)的表不適用

  
  對(duì)AUTO_INCREMENT的操作

  
  
  每表一個(gè)AUTO_INCREMEN列的內(nèi)部處理。

  MyISAMINSERTUPDATE操作自動(dòng)更新這一列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂?shù)闹当粍h除之后就不能再利用。(當(dāng)AUTO_INCREMENT列被定義為多列索引的最后一列,可以出現(xiàn)重使用從序列頂部刪除的值的情況)。

  AUTO_INCREMENT值可用ALTER TABLE或myisamch來(lái)重置

  對(duì)于AUTO_INCREMENT類(lèi)型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引

  更好和更快的auto_increment處理

  
  如果你為一個(gè)表指定AUTO_INCREMENT列,在數(shù)據(jù)詞典里的InnoDB表句柄包含一個(gè)名為自動(dòng)增長(zhǎng)計(jì)數(shù)器的計(jì)數(shù)器,它被用在為該列賦新值。

  自動(dòng)增長(zhǎng)計(jì)數(shù)器僅被存儲(chǔ)在主內(nèi)存中,而不是存在磁盤(pán)上

  關(guān)于該計(jì)算器的算法實(shí)現(xiàn),請(qǐng)參考

  AUTO_INCREMENT列在InnoDB里如何工作

  
  表的具體行數(shù)
  
  select count(*) from table,MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù),注意的是,當(dāng)count(*)語(yǔ)句包含   where條件時(shí),兩種表的操作是一樣的

  
  InnoDB 中不保存表的具體行數(shù),也就是說(shuō),執(zhí)行select count(*) from table時(shí),InnoDB要掃描一遍整個(gè)表來(lái)計(jì)算有多少行

  
  
  
  表鎖

  
  提供行鎖(locking on row level),提供與 Oracle 類(lèi)型一致的不加鎖讀取(non-locking read in
   SELECTs),另外,InnoDB表的行鎖也不是絕對(duì)的,如果在執(zhí)行一個(gè)SQL語(yǔ)句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表, 例如update table set num=1 where name like "%aaa%"

MySQL 存儲(chǔ)引擎 MyISAM 與 InnoDB 如何選擇?

雖然 MySQL 里的存儲(chǔ)引擎不只是 MyISAM 與 InnoDB 這兩個(gè),但常用的就是它倆了。可能有站長(zhǎng)并未注意過(guò) MySQL 的存儲(chǔ)引擎,其實(shí)存儲(chǔ)引擎也是數(shù)據(jù)庫(kù)設(shè)計(jì)里的一大重要點(diǎn),那么博客系統(tǒng)應(yīng)該使用哪種存儲(chǔ)引擎呢?

下面我們分別來(lái)看兩種存儲(chǔ)引擎的區(qū)別。

  • 一、InnoDB支持事務(wù),MyISAM不支持,這一點(diǎn)是非常之重要。事務(wù)是一種高級(jí)的處理方式,如在一些列增刪改中只要哪個(gè)出錯(cuò)還可以回滾還原,而MyISAM就不可以了。

  • 二、MyISAM適合查詢以及插入為主的應(yīng)用,InnoDB適合頻繁修改以及涉及到安全性較高的應(yīng)用

  • 三、InnoDB支持外鍵,MyISAM不支持

  • 四、MyISAM是默認(rèn)引擎,InnoDB需要指定

  • 五、InnoDB不支持FULLTEXT類(lèi)型的索引

  • 六、InnoDB中不保存表的行數(shù),如select count(*) from table時(shí),InnoDB需要掃描一遍整個(gè)表來(lái)計(jì)算有多少行,但是MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù)即可。注意的是,當(dāng)count(*)語(yǔ)句包含where條件時(shí)MyISAM也需要掃描整個(gè)表

  • 七、對(duì)于自增長(zhǎng)的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中可以和其他字段一起建立聯(lián)合索引

  • 八、清空整個(gè)表時(shí),InnoDB是一行一行的刪除,效率非常慢。MyISAM則會(huì)重建表

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

通過(guò)以上九點(diǎn)區(qū)別,結(jié)合個(gè)人博客的特點(diǎn),推薦個(gè)人博客系統(tǒng)使用MyISAM,因?yàn)樵诓┛屠镏饕僮魇亲x取和寫(xiě)入,很少有鏈?zhǔn)讲僮?。所以選擇MyISAM引擎使你博客打開(kāi)也頁(yè)面的效率要高于InnoDB引擎的博客,當(dāng)然只是個(gè)人的建議,大多數(shù)博客還是根據(jù)實(shí)際情況下謹(jǐn)慎選擇。

一些關(guān)于MyISAM與InnoDB選擇使用:

MYISAM和INNODB是Mysql數(shù)據(jù)庫(kù)提供的兩種存儲(chǔ)引擎。兩者的優(yōu)劣可謂是各有千秋。INNODB會(huì)支持一些關(guān)系數(shù)據(jù)庫(kù)的高級(jí)功能,如事務(wù)功能和行級(jí)鎖,MYISAM不支持。MYISAM的性能更優(yōu),占用的存儲(chǔ)空間少。所以,選擇何種存儲(chǔ)引擎,視具體應(yīng)用而定。

如果你的應(yīng)用程序一定要使用事務(wù),毫無(wú)疑問(wèn)你要選擇INNODB引擎。但要注意,INNODB的行級(jí)鎖是有條件的。在where條件沒(méi)有使用主鍵時(shí),照樣會(huì)鎖全表。比如DELETE FROM mytable這樣的刪除語(yǔ)句。

如果你的應(yīng)用程序?qū)Σ樵冃阅芤筝^高,就要使用MYISAM了。MYISAM索引和數(shù)據(jù)是分開(kāi)的,而且其索引是壓縮的,可以更好地利用內(nèi)存。所以它的查詢性能明顯優(yōu)于INNODB。壓縮后的索引也能節(jié)約一些磁盤(pán)空間。MYISAM擁有全文索引的功能,這可以極大地優(yōu)化LIKE查詢的效率。

有人說(shuō)MYISAM只能用于小型應(yīng)用,其實(shí)這只是一種偏見(jiàn)。如果數(shù)據(jù)量比較大,這是需要通過(guò)升級(jí)架構(gòu)來(lái)解決,比如分表分庫(kù),而不是單純地依賴(lài)存儲(chǔ)引擎。

其他一些說(shuō)法:

現(xiàn)在一般都是選用innodb了,主要是myisam的全表鎖,讀寫(xiě)串行問(wèn)題,并發(fā)效率鎖表,效率低myisam對(duì)于讀寫(xiě)密集型應(yīng)用一般是不會(huì)去選用的。

關(guān)于Mysql數(shù)據(jù)庫(kù)默認(rèn)的存儲(chǔ)引擎:

MyISAM和InnoDB是MySQL的兩種存儲(chǔ)引擎。如果是默認(rèn)安裝,那就應(yīng)該是InnoDB,你可以在my.ini文件中找到default-storage-engine=INNODB;當(dāng)然你可以在建表時(shí)指定相應(yīng)的存儲(chǔ)引擎。通過(guò)show create table xx 可以看見(jiàn)相應(yīng)信息。

Mysql中InnoDB和MyISAM的比較

MyISAM:

每個(gè)MyISAM在磁盤(pán)上存儲(chǔ)成三個(gè)文件。第一個(gè)文件的名字以表的名字開(kāi)始,擴(kuò)展名指出文件類(lèi)型。.frm文件存儲(chǔ)表定義。數(shù)據(jù)文件的擴(kuò)展名為.MYD (MYData)。

MyISAM表格可以被壓縮,而且它們支持全文搜索。不支持事務(wù),而且也不支持外鍵。如果事物回滾將造成不完全回滾,不具有原子性。在進(jìn)行updata時(shí)進(jìn)行表鎖,并發(fā)量相對(duì)較小。如果執(zhí)行大量的SELECT,MyISAM是更好的選擇。

MyISAM的索引和數(shù)據(jù)是分開(kāi)的,并且索引是有壓縮的,內(nèi)存使用率就對(duì)應(yīng)提高了不少。能加載更多索引,而Innodb是索引和數(shù)據(jù)是緊密捆綁的,沒(méi)有使用壓縮從而會(huì)造成Innodb比MyISAM體積龐大不小

MyISAM緩存在內(nèi)存的是索引,不是數(shù)據(jù)。而InnoDB緩存在內(nèi)存的是數(shù)據(jù),相對(duì)來(lái)說(shuō),服務(wù)器內(nèi)存越大,InnoDB發(fā)揮的優(yōu)勢(shì)越大。

優(yōu)點(diǎn):查詢數(shù)據(jù)相對(duì)較快,適合大量的select,可以全文索引。

缺點(diǎn):不支持事務(wù),不支持外鍵,并發(fā)量較小,不適合大量update

InnoDB:

這種類(lèi)型是事務(wù)安全的。.它與BDB類(lèi)型具有相同的特性,它們還支持外鍵。InnoDB表格速度很快。具有比BDB還豐富的特性,因此如果需要一個(gè)事務(wù)安全的存儲(chǔ)引擎,建議使用它。在update時(shí)表進(jìn)行行鎖,并發(fā)量相對(duì)較大。如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應(yīng)該使用InnoDB表。

優(yōu)點(diǎn):支持事務(wù),支持外鍵,并發(fā)量較大,適合大量update

缺點(diǎn):查詢數(shù)據(jù)相對(duì)較快,不適合大量的select

對(duì)于支持事物的InnoDB類(lèi)型的表,影響速度的主要原因是AUTOCOMMIT默認(rèn)設(shè)置是打開(kāi)的,而且程序沒(méi)有顯式調(diào)用BEGIN 開(kāi)始事務(wù),導(dǎo)致每插入一條都自動(dòng)Commit,嚴(yán)重影響了速度??梢栽趫?zhí)行sql前調(diào)用begin,多條sql形成一個(gè)事物(即使autocommit打開(kāi)也可以),將大大提高性能。

基本的差別為:MyISAM類(lèi)型不支持事務(wù)處理等高級(jí)處理,而InnoDB類(lèi)型支持。

MyISAM類(lèi)型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類(lèi)型更快,但是不提供事務(wù)支持,而InnoDB提供事務(wù)支持已經(jīng)外部鍵等高級(jí)數(shù)據(jù)庫(kù)功能。

其他比較:

MyIASM是IASM表的新版本,有如下擴(kuò)展:

  • 二進(jìn)制層次的可移植性。

  • NULL列索引。

  • 對(duì)變長(zhǎng)行比ISAM表有更少的碎片。

  • 支持大文件。

  • 更好的索引壓縮。

  • 更好的鍵嗎統(tǒng)計(jì)分布。

  • 更好和更快的auto_increment處理。

以下是一些細(xì)節(jié)和具體實(shí)現(xiàn)的差別:

  • 1.InnoDB不支持FULLTEXT類(lèi)型的索引。

  • 2.InnoDB 中不保存表的具體行數(shù),也就是說(shuō),執(zhí)行select count(*) from table時(shí),InnoDB要掃描一遍整個(gè)表來(lái)計(jì)算有多少行,但是MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù) 即可。注意的是,當(dāng)count(*)語(yǔ)句包含 where條件時(shí),兩種表的操作是一樣的。

  • 3.對(duì)于AUTO_INCREMENT類(lèi)型的字段,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語(yǔ)句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表,例如update table set num=1 where name like "%aaa%"

任何一種表都不是萬(wàn)能的,只用恰當(dāng)?shù)尼槍?duì)業(yè)務(wù)類(lèi)型來(lái)選擇合適的表類(lèi)型,才能最大的發(fā)揮MySQL的性能優(yōu)勢(shì)。

innodb和myisam更新比較:

innodb的數(shù)據(jù)組織就是按照主鍵建成的一個(gè)B+樹(shù),如果沒(méi)有顯示的定義主鍵,那么innodb會(huì)選區(qū)一個(gè)not null unique key,作為主鍵,如果還是沒(méi)有,那么innodb會(huì)創(chuàng)建一個(gè) 6字節(jié)的主鍵,主鍵索引到頁(yè)不是具體的行位置

不是遞增的主鍵會(huì)使得插入的速度很慢,例如使用手機(jī)號(hào)或身份證號(hào)做為主鍵,所以善用AUTO_INCREMENT

表大不可怕,可怕的是count或者高偏移limit,可以將大的limit big換成 limit max_id, xxxxx

Limit 0 1000 | limit 1001 1000 | limit 2001 1000Limit 0 1000 | where id>max_id1 limit 1000 | where id>max_id2 limit 1000

對(duì)于InnoDB來(lái)說(shuō),按照某列分表,想在單臺(tái)服務(wù)器上提高性能是沒(méi)有意義的

插入的速度和查詢的速度有時(shí)候是不可調(diào)和的矛盾

說(shuō)InnoDB不適合做count是不對(duì)的,MyISAM也是一樣的慢,只不過(guò)MyISAM將正表的行數(shù)緩存起來(lái),所以count整表很快,如果有查詢條件,并且不是主鍵查詢,那就沒(méi)有什么區(qū)別,主鍵count慢的原因是innodb是按照主鍵組織的,按照主鍵count的時(shí)候,會(huì)加載數(shù)據(jù)

InnoDB的頁(yè)式存儲(chǔ)會(huì)使得InnoDB更容易做整表緩存和熱備份

如果表索引很多,那么InnoDB的更新速度要大于MyISAM,因?yàn)镮nnoDB的輔助索引關(guān)聯(lián)的是表的主鍵,是一個(gè)邏輯的值,而MyISAM的所有索引關(guān)聯(lián)的是數(shù)據(jù)的物理位置,更新時(shí)有可能數(shù)據(jù)的物理位置發(fā)生變化,如果發(fā)生變化,那么所有的索引都要做更新

InnoDB 中不保存表的具體行數(shù),也就是說(shuō),執(zhí)行select count(*) from table時(shí),InnoDB要掃描一遍整個(gè)表來(lái)計(jì)算有多少行,但是MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù)即可。注意的是,當(dāng)count(*)語(yǔ)句包含 where條件時(shí),兩種表的操作是一樣的。


如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答!! 點(diǎn)擊進(jìn)入論壇

發(fā)表評(píng)論 (416人查看,0條評(píng)論)
請(qǐng)自覺(jué)遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱(chēng):
最新評(píng)論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)