架構師_程序員

 找回密碼
 注冊[Register]

QQ登錄

只需一步,快速開始

查看: 148|回復: 0
打印 上一主題 下一主題

[資料] MySQL數據庫存儲引擎MyISAM與InnoDB區別

[復制鏈接]
跳轉到指定樓層
樓主
發表于 2020-4-13 09:53:49 | 只看該作者
提到MySQL,不了解MyISAM與InnoDB是說不過去的,它們是最著名、使用最廣泛的兩種MySQL存儲引擎。今天做網站小編就和大伙聊聊MySQL中MyISAM與InnoDB區別及選擇...

什么是MyISAM?

MyISAM是MySQL關系數據庫管理系統的默認儲存引擎(5.5之前)。這種MySQL表存儲結構從舊的ISAM代碼擴展 出許多有用的功能。在新版本的MySQL中,InnoDB引擎由于其對事務,參照完整性,以及更高的并發性等優點開始廣泛的取代MyISAM。
每一個MyISAM表都對應于硬盤上的三個文件。這三個文件有一樣的文件名,但是有不同的擴展名以指示其類型用途:.frm文件保存表的定義,但是這個文件并不是MyISAM引擎的一部分,而是服務器的一部分;.MYD保存表的數據;.MYI是表的索引文件。

什么是InnoDB?

InnoDB是MySQL的另一個存儲引擎,目前MySQL AB所發行新版的標準,被包含在所有二進制安裝包里,5.5之后作為默認的存儲引擎。較之于其它的存儲引擎它的優點是它支持兼容ACID的事務(類似于PostgreSQL),以及參數 完整性(即對外鍵的支持)。

Oracle公司與2005年10月收購了Innobase。Innobase采用雙認證授權。它使用GNU發行,也允許其它想將InnoDB結合到商業軟件的團體獲得授權。

目前比較普及的存儲引擎是MyISAM和InnoDB。MyISAM與InnoDB的主要的不同點在于性能和事務控制上。MyISAM是早期ISAM(Indexed Sequential Access Method,MySQL5.0之后已經不支持ISAM了)的擴展實現,ISAM被設計為適合處理讀頻率遠大于寫頻率這樣的情況,因此ISAM以及后來的MyISAM都沒有考慮對事物的支持,排除了TPM,不需要事務記錄,ISAM的查詢效率相當可觀,而且內存占用很少。
MyISAM在繼承了這類優點的同時,與時俱進地提供了大量實用的新特性和相關工具。例如考慮到并發控制,提供了表級鎖,雖然MyISAM本身不支持容錯,但可以通過 myisamchk進行故障恢復。而且由于MyISAM是每張表使用各自獨立的存儲文件(MYD數據文件和MYI索引文件),使得備份及恢復十分方便(拷貝覆蓋即可),而且還支持在線恢復。與其他存儲引擎比較,MyISAM具有檢查和修復表格的大多數工具. MyISAM表格可以被壓縮,而且它們支持全文(fulltext)搜索。它們不是事務安全的,而且也不支持外鍵所以如果你的應用是不需要事務,處理的只是基本的CRUD操作,那么MyISAM是不二選擇。
InnoDB被設計成適用于高并發讀寫的情況,使用MVCC(Multi-Version Concurrency Control)以及行級鎖來提供遵從ACID的事務支持。InnoDB支持外鍵參照完整性,具備故障恢復能力。另外 InnoDB的性能其實還是不錯的,特別是在處理大數據量的情況下,用官方的話說就是: InnoDB的CPU效率是其他基于磁盤的關系數據庫存儲引擎所不能比的。不過InnoDB的備份恢復要麻煩一點,除非你使用了4.1以后版本提供的 Mulit-tablespace支持,因為InnoDB和MyISAM不同,他的數據文件并不是獨立對應于每張表的。而是使用的共享表空間,簡單的拷貝覆蓋方法對他不適用,必須在停掉MYSQL后對進行數據恢復。使用Per-Table Tablespacesd,使其每張表對應一個獨立的表空間文件,則情況要簡單很多。它與BDB類型具有相同的特性,它們還支持外鍵。InnoDB表格速度很快,具有比BDB還豐富的特性,因此如果需要一個事務安全的存儲引擎,建議使用它。

一般來說,如果需要事務支持,并且有較高的并發讀寫頻率,InnoDB是不錯的選擇。要是并發讀寫頻率不高的話,其實可以考慮BDB,但由于在 MySQL5.1及其以后版本中,將不再提供BDB支持。這個選項也就沒有了

InnoDB默認情況下的事務是打開的(set autocommit = 0)就是說每插入一條記錄時候,InnoDB類型的表都會把它當作一個單獨的事務來處理.所以如果我們插入了10000條記錄,而且沒有將事務關閉,那么 InnoDB類型的表會把它當作10000個事務來處理,此時插入的總時間是很多的,這個時候一定要首先把事務關掉再插入,這樣的速度就很快了 至于Heap和BDB(Berkeley DB),相對來說,普及率不如前兩種,但在有些情況下,還是挺適用的Heap存儲引擎就是將數據存儲在內存中,由于沒有磁盤I/O的等待,速度極快。但由于是內存存儲引擎,所做的任何修改在服務器重啟后都將消失。Heap挺適合做測試的時候使用BDB是MySQL第一款事務安全的存儲引擎。在Berkeley DB database library的基礎上建立,同樣是事務安全的,但BDB的普及率顯然不及InnoDB,因為大多數在MySQL中尋找支持事務的存儲引擎的同時也在找支 持MVCC或是行級鎖定存儲引擎,而BDB只支持Page-level Lock。

InnoDB引擎

InnoDB是一個事務型的存儲引擎,支持回滾,設計目標是處理大數量數據時提供高性能的服務,它在運行時會在內存中建立緩沖池,用于緩沖數據和索引。

InnoDB引擎優點

1、支持事務處理、ACID事務特性;

2、實現了SQL標準的四種隔離級別;

3、支持行級鎖和外鍵約束;

4、可以利用事務日志進行數據恢復。

5、鎖級別為行鎖,行鎖優點是適用于高并發的頻繁表修改,高并發是性能優于 MyISAM。缺點是系統消耗較大。

6、索引不僅緩存自身,也緩存數據,相比 MyISAM 需要更大的內存。

InnoDB引擎缺點

因為它沒有保存表的行數,當使用COUNT統計時會掃描全表。

MyISAM引擎

MyISAM 是 MySQL 5.5.5 之前的默認引擎,它的設計目標是快速讀取。

MyISAM引擎優點

1.高性能讀??;

2.因為它保存了表的行數,當使用COUNT統計時不會掃描全表;

MyISAM引擎缺點

1、鎖級別為表鎖,表鎖優點是開銷小,加鎖快;缺點是鎖粒度大,發生鎖沖動概率較高,容納并發能力低,這個引擎適合查詢為主的業務。

2、此引擎不支持事務,也不支持外鍵。

3、INSERT和UPDATE操作需要鎖定整個表;

4、它存儲表的行數,于是SELECT COUNT(*) FROM TABLE時只需要直接讀取已經保存好的值而不需要進行全表掃描。

適用場景

MyISAM適合:(1)做很多count 的計算;(2)插入不頻繁,查詢非常頻繁;(3)沒有事務。

InnoDB適合:(1)可靠性要求比較高,或者要求事務;(2)表更新和查詢都相當的頻繁,并且表鎖定的機會比較大的情況。

表格對比

屬性MyISAMHeapBDBInnoDB
事務不支持不支持支持支持
鎖粒度表鎖表鎖頁鎖(page, 8KB)行鎖
存儲拆分文件內存中每個表一個文件表空間
隔離等級讀已提交所有
可移植格式N/A
引用完整性
數據主鍵
MySQL緩存數據記錄
可用性全版本全版本MySQL-Max全版本


一些細節上的差別


1、InnoDB不支持FULLTEXT類型的索引,MySQL5.6之后已經支持(實驗性)。

2、InnoDB中不保存表的 具體行數,也就是說,執行select count() from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count()語句包含 where條件時,兩種表的操作是一樣的。

3、對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引。

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

5、LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用。

6、另外,InnoDB表的行鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表。

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





上一篇:匯編實驗題
下一篇:sql 語句中int轉varchar類型
帖子永久地址: 

架構師_程序員 - 論壇版權1、本主題所有言論和圖片純屬會員個人意見,與本論壇立場無關
2、本站所有主題由該帖子作者發表,該帖子作者與架構師_程序員享有帖子相關版權
3、其他單位或個人使用、轉載或引用本文時必須同時征得該帖子作者和架構師_程序員的同意
4、帖子作者須承擔一切因本文發表而直接或間接導致的民事或刑事法律責任
5、本帖部分內容轉載自其它媒體,但并不代表本站贊同其觀點和對其真實性負責
6、如本帖侵犯到任何版權問題,請立即告知本站,本站將及時予與刪除并致以最深的歉意
7、架構師_程序員管理員和版主有權不事先通知發貼者而刪除本文

碼農網,只發表在實踐過程中,遇到的技術難題,不誤導他人。
您需要登錄后才可以回帖 登錄 | 注冊[Register]

本版積分規則

免責聲明:
碼農網所發布的一切軟件、編程資料或者文章僅限用于學習和研究目的;不得將上述內容用于商業或者非法用途,否則,一切后果請用戶自負。本站信息來自網絡,版權爭議與本站無關。您必須在下載后的24個小時之內,從您的電腦中徹底刪除上述內容。如果您喜歡該程序,請支持正版軟件,購買注冊,得到更好的正版服務。如有侵權請郵件與我們聯系處理。

Mail To:help@itsvse.com

QQ|Archiver|手機版|小黑屋|架構師 ( 魯ICP備14021824號-2 )|網站地圖

GMT+8, 2020-6-6 13:29

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回復 返回頂部 返回列表
捕鸟达人老版