MySQL常見的兩種存儲引擎:MyISAM與InnoDB的愛恨情仇

一 MyISAM

1.1 MyISAM簡介
MyISAM是MySQL的默認數據庫引擎(5.5版之前),由早期的 ISAM (Indexed Sequential Access Method:有索引的順序訪問方法)所改良。雖然性能極佳,而且提供了大量的特性,包括全文索引、壓縮、空間函數等,但MyISAM不支持事務和行級鎖,而且最大的缺陷就是崩潰后無法安全恢復。不過,5.5版本之后,MySQL引入了InnoDB(另一種數據庫引擎)。

下面這張圖只是想表達的意思是現在大多數時候我們使用的都是InnoDB存儲引擎,但是在某些情況下使用 MyISAM 也是合適的比如讀密集的情況下。(如果你不介意 MyISAM 崩潰回復問題的話)。在這里插入圖片描述

5.5版本之后,MySQL引入了InnoDB
1.2 MyISAM特點
不支持行鎖(MyISAM只有表鎖),讀取時對需要讀到的所有表加鎖,寫入時則對表加排他鎖;
不支持事務
不支持外鍵
不支持崩潰后的安全恢復
在表有讀取查詢的同時,支持往表中插入新紀錄
支持BLOB和TEXT的前500個字符索引,支持全文索引
支持延遲更新索引,極大地提升了寫入性能
對于不會進行修改的表,支持 壓縮表 ,極大地減少了磁盤空間的占用
補充概念:

Mysql的行鎖和表鎖( 鎖是計算機協調多個進程或純線程并發訪問某一資源的機制) 表級鎖: 每次操作鎖住整張表。開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,并發度最低; 行級鎖: 每次操作鎖住一行數據。開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,并發度也最高;

二 InnoDB

2.1 InnoDB簡介
InnoDB是MySQL的默認數據庫引擎(5.5版之后),2006年五月時由甲骨文公司并購。與傳統的ISAM與MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事務(Transaction)功能。

2.2 InnoDB特點
支持行鎖,采用MVCC來支持高并發,有可能死鎖
支持事務
支持外鍵
支持崩潰后的安全恢復
不支持全文索引
三 關于二者的對比與總結
3.1 二者的常見對比

  1. count運算上的區別: 因為MyISAM緩存有表meta-data(行數等),因此在做COUNT(*)時對于一個結構很好的查詢是不需要消耗多少資源的。而對于InnoDB來說,則沒有這種緩存。

  2. 是否支持事務和崩潰后的安全恢復: MyISAM 強調的是性能,每次查詢具有原子性,其執行數度比InnoDB類型更快,但是不提供事務支持。但是InnoDB 提供事務支持事務,外部鍵等高級數據庫功能。 具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。

3)是否支持外鍵: MyISAM不支持,而InnoDB支持。

《MySQL高性能》上面有一句話這樣寫到:

不要輕易相信“MyISAM比InnoDB快”之類的經驗之談,這個結論往往不是絕對的。在很多我們已知場景中,InnoDB的速度都可以讓MyISAM望塵莫及,尤其是用到了聚簇索引,或者需要訪問的數據都可以放入內存的應用。

一般情況下我們選擇 InnoDB 都是沒有問題的,但是某些情況下你并不在乎可擴展能力和并發能力,也不需要事務支持,也不在乎崩潰后的安全恢復問題的話,選擇MyISAM也是一個不錯的選擇。但是一般情況下,我們都是需要考慮到這些問題的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444044.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444044.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444044.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode193. 有效電話號碼 正則了解一下

給定一個包含電話號碼列表(一行一個電話號碼)的文本文件 file.txt,寫一個 bash 腳本輸出所有有效的電話號碼。 你可以假設一個有效的電話號碼必須滿足以下兩種格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一個數字…

leetcode258. 各位相加

給定一個非負整數 num,反復將各個位上的數字相加,直到結果為一位數。 示例: 輸入: 38 輸出: 2 解釋: 各位相加的過程為:3 8 11, 1 1 2。 由于 2 是一位數,所以返回 2。 進階: 你可以不使用循環或者遞歸,且在 O(…

leetcode412. Fizz Buzz

寫一個程序,輸出從 1 到 n 數字的字符串表示。 1. 如果 n 是3的倍數,輸出“Fizz”; 2. 如果 n 是5的倍數,輸出“Buzz”; 3.如果 n 同時是3和5的倍數,輸出 “FizzBuzz”。 示例: n 15, 返…

leetcode359. 日志速率限制器

請你設計一個日志系統,可以流式接收日志以及它的時間戳。 該日志會被打印出來,需要滿足一個條件:當且僅當日志內容 在過去的 10 秒鐘內沒有被打印過。 給你一條日志的內容和它的時間戳(粒度為秒級),如果這…

怎樣提高WebService性能大數據量網絡傳輸處理(轉)

1. 直接返回DataSet對象 特點:通常組件化的處理機制,不加任何修飾及 處理; 優點:代碼精減、易于處理,小數據量處理較快; 缺點:大數據量的傳遞處理慢,消耗網絡資源; 建議&…

【中國互聯網江湖30年歷史】再無風清揚,再有少年郎

0 馬云退了。 在蕭山奧體中心,無數阿里人的祝福中,流著眼淚,結束了自己在阿里的最后一天。 從此互聯網江湖再無風清揚,反而多了一個叫做馬云的鄉村教師。 他臨別一揮手,似乎帶走了中國互聯網的一個時代。 20年浮沉&…

互聯網30年,泡沫如夢

人人都說互聯網改變世界,這話沒錯。 但我認為互聯網改變的方式,是泡沫。 資金,資源,人才因為一堆概念聚在一起,形成一個又一個的泡沫,然后泡沫破裂,大部分人失敗,少數能夠留下來的&a…

cpp知識匯總(1) 指針vs引用、static、const

引用和指針的區別? 指針是一個實體,需要分配內存空間。引用只是變量的別名,不需要分配內存空間。引用在定義的時候必須進行初始化,并且不能夠改變。指針在定義的時候不一定要初始化,并且指向的空間可變。(…

【精品計劃 附錄2】- 算法分析

數學模型 1. 近似2. 增長數量級3. 內循環4. 成本模型 注意事項 1. 大常數2. 緩存3. 對最壞情況下的性能的保證4. 隨機化算法5. 均攤分析 ThreeSum 1. ThreeSumSlow2. ThreeSumBinarySearch3. ThreeSumTwoPointer 倍率實驗 數學模型 1. 近似 N3/6-N2/2N/3 ~ N3/6。使用 ~f(N) …

俄羅斯方塊(C++)

#include<iostream> #include<stdlib.h> #include<windows.h> #include<time.h> #include<conio.h> using namespace std;#define A1 0//A代表長條型&#xff0c;B為方塊&#xff0c;C為L型&#xff0c;D為閃電型&#xff08;實在無法描述那個形…

leetcode445. 兩數相加 II

給你兩個 非空 鏈表來代表兩個非負整數。數字最高位位于鏈表開始位置。它們的每個節點只存儲一位數字。將這兩數相加會返回一個新的鏈表。 你可以假設除了數字 0 之外&#xff0c;這兩個數字都不會以零開頭。 進階&#xff1a; 如果輸入鏈表不能修改該如何處理&#xff1f;換…

Java中如何實現每天定時對數據庫的操作

現在有一個很棘手的問題&#xff1a;客戶要贈加一個功能&#xff0c;就是每天晚上11點要統計一下數據&#xff0c;并存到一個文件中&#xff0c;我試著用線程&#xff0c;但是總達不到理想的效果。請給點思路&#xff0c;多謝了。 我們的開發環境是tomcat和servlet&#xff0c;…

leetcode面試題 02.08. 環路檢測

給定一個有環鏈表&#xff0c;實現一個算法返回環路的開頭節點。 有環鏈表的定義&#xff1a;在鏈表中某個節點的next元素指向在它前面出現過的節點&#xff0c;則表明該鏈表存在環路。 示例 1&#xff1a; 輸入&#xff1a;head [3,2,0,-4], pos 1 輸出&#xff1a;tail co…

leetcode485. 最大連續1的個數 *py:“又是一行就解決了,沒意思”

給定一個二進制數組&#xff0c; 計算其中最大連續1的個數。 示例 1: 輸入: [1,1,0,1,1,1] 輸出: 3 解釋: 開頭的兩位和最后的三位都是連續1&#xff0c;所以最大連續1的個數是 3. 注意&#xff1a; 輸入的數組只包含 0 和1。 輸入數組的長度是正整數&#xff0c;且不超過 1…

leetcode645. 錯誤的集合

645. 錯誤的集合 難度簡單98 集合 S 包含從1到 n 的整數。不幸的是&#xff0c;因為數據錯誤&#xff0c;導致集合里面某一個元素復制了成了集合里面的另外一個元素的值&#xff0c;導致集合丟失了一個整數并且有一個元素重復。 給定一個數組 nums 代表了集合 S 發生錯誤后的…

一篇文章揭穿創業公司的套路

初衷 每個初入社會的求職者&#xff0c;都曾經有過找工作被坑的經歷。總結了以下潛臺詞&#xff0c;如果你能全部GET到&#xff0c;那么恭喜你&#xff0c;已被老板們拉入黑名單。 核心 「工資4k - 8k」——那工資就是4k 「工資上不封頂」——就是說說而已&#xff0c;沒人會給…

java獲取IP地址:

public class IPDemo {public static void main(String [] args) throws UnknownHostException{//獲取本地主機InetAddress localHost InetAddress.getLocalHost();System.out.println(localHost);//Lenovo-sxg/192.168.1.106//獲取本地主機的IP地址String ipaddress localHo…

《三天給你聊清楚redis》第1天先嘮嘮redis是個啥(18629字)

后端需要知道的關于redis的事&#xff0c;基本都在這里了。 此文后續會改為粉絲可見&#xff0c;所以喜歡的請提前關注。 你的點贊和評論是我創作的最大動力&#xff0c;謝謝。 1、入門 Redis是一款基于鍵值對的NoSQL數據庫&#xff0c;它的值支持多種數據結構&#xff1a;…

獲取IP地址:

public class IPDemo {public static void main(String [] args) throws UnknownHostException{//獲取本地主機InetAddress localHost InetAddress.getLocalHost();System.out.println(localHost);//Lenovo-sxg/192.168.1.106//獲取本地主機的IP地址String ipaddress localHo…

使用github+jsdelivr作為視頻床

感謝JefferyIF大佬提供的神奇方法。 1. 配置FFmpeg 注&#xff1a;IOS因為不支持HLS&#xff0c;所以對IOS上無法正常播放視頻&#xff0c;其他端都可以正常播放。 因為腳本要使用到FFmeg對源視頻文件切分成m3u8格式&#xff0c;所以在使用腳本之前&#xff0c;請配置好 FFm…