MySQL 存儲引擎 | MyISAM 與 InnoDB

文章目錄

  • 概念
    • innodb引擎的4大特性
  • 索引結構
    • InnoDB
    • MyISAM
  • 區別
  • 表級鎖和行級鎖


概念

MyISAMMySQL 的默認數據庫引擎(5.5版之前),但因為不支持事務處理而被 InnoDB 替代。

然而事物都是有兩面性的,InnoDB 支持事務處理也會帶來一些問題:

  • 當操作完全兼容 ACID 時,InnoDB自動合并多個連接,但每次有事務產生時,仍至少須寫入硬盤一次,因此對于某些硬盤或磁盤陣列,會造成 每秒200次 的事務處理上限。

  • 若希望達到更高的性能且保持事務的完整性,就必使用磁盤緩存電池備援。當然 InnoDB 也提供數種對性能沖擊較低的模式,但相對的也會降低事務的完整性。


innodb引擎的4大特性

插入緩沖(insert buffer):

為解決非聚集索引的寫性能問題(插入或更新)而生。

對非聚集索引的插入或更新操作,不是每一次都直接插入到索引頁中,而是先判斷插入的非聚集索引頁是否在緩沖池中:

  • 若在則直接插入;
  • 不在則先放入到一個 Insert Buffer 對象中。

此時看似數據庫這個非聚集索引已經插入到了葉子節點,然而實際上只是存放在另一個位置。然后再以一定的頻率進行 Insert Buffer 與輔助索引葉子節點的 merge 操作,此時通常能將多個插入合并到一個操作中,這就大大提高了非聚集索引插入的性能。

二次寫(double write):

數據庫宕機可能會引起部分寫失效(partial page write),解決方法有兩種:

  • 數據庫宕機,物理文件完好無損,是可以通過 redo log 進行崩潰恢復(ACID中的持久性)。
  • 數據庫宕機,物理文件由于宕機發生損壞,這時就無法通過 redo log 進行數據恢復了, 而只能通過 double write 解決問題。

二次寫分為三步:

  1. 對緩沖池臟頁進行刷新時,先將臟頁復制到內存的 double write buffer
  2. 第一次寫:double write buffer 分批次寫入到共享表空間中,因為共享表空間是連續存儲所以很快。
  3. 第二次寫:double write buffer 中數據寫入到各個表空間文件中,而此時的寫入則是離散的,因為各個表空間可能在磁盤的不同位置,因此寫入速度較慢。

在這里插入圖片描述
PS:參數 skip_innodb_doublewrite 可以禁用 double write 功能,但不推薦這樣做。對于需要提供數據高可靠性的主服務器,任何時候都應該確保開啟 double write 功能。

自適應哈希索引(ahi):

InnoDB存儲引擎 會監控對表上各個索引頁的查詢,如果它觀察到建立哈希索引可以帶來速度提升,則會自行建立哈希索引,這也就是 自適應哈希索引。 即會自動根據 訪問頻率和模式 來為 熱點數據 建立哈希索引。

哈希索引是數據庫自身自動創建并使用的,人工無法對其進行干預。

預讀(read ahead):

為了提高磁盤操作性能,當前的數據庫系統都采用 異步IO 的方式來處理磁盤操作,InnoDB 也是如此。

同步阻塞: 每進行一次IO操作,需要等待此次操作結束才能繼續接下來的操作。

但是如果一條 SQL語句 需要掃描多個索引頁,也就是需要進行多次 IO操作(掃描一個頁就是一次IO請求) 。同步阻塞會掃描一個頁并等待其完成再進行下一個頁掃描,也就是等待一個IO請求完成后再發送下一個IO請求,效率很低。

異步非阻塞(AIO): 用戶可以在發出一個 IO請求 后不必等待其完成,而是可以立即發出下一個 IO請求


索引結構

我們在MySQL 索引 :哈希索引、B+樹索引、全文索引中介紹過聚集索引和非聚集索引,現在結合兩個存儲引擎深入研究一下。

兩者都使用 B+樹 作為索引結構,但實現方式卻截然不同:

  • 主鍵索引: InnoDB 的數據文件本身就是索引文件;MyISAM 主鍵索引的葉節點存的是數據地址。
  • 輔助索引: InnoDB 的輔助索引 data域 存儲相應記錄主鍵的值而不是地址; MyISAM 輔助索引的葉節點存的還是數據地址。

InnoDB

InnoDB聚集索引

  • 數據文件和主鍵索引綁在一起(表數據文件本身就是按 B+Tree 組織的一個索引結構),必須要有主鍵,通過主鍵索引效率很高。主鍵索引的葉節點保存了完整的數據記錄。
  • 但是輔助索引需要兩次查詢,先查詢到主鍵,然后再通過主鍵查詢到數據。主鍵不應該過大,因為主鍵太大,其他索引也都會很大。輔助索引的葉子節點是主鍵的值。
    在這里插入圖片描述
    圖源博客

MyISAM

MyISAM非聚集索引

  • 索引和數據文件是分離的,主鍵索引和輔助索引的葉子節點都是數據文件的地址指針。主鍵索引要求每個葉子節點的內容是唯一的,而輔助索引每個葉子節點的內容可以重復。
  • 主鍵索引和輔助索引是獨立的。因此不同于 InnoDB 需要先在輔助索引中查找到主鍵,再通過主鍵主鍵索引中查找到具對應數據。MyISAM 可通過輔助索引快速找到所有的數據,而不需要再遍歷一邊主鍵索引,所以適用于OLAP。
    在這里插入圖片描述

區別

myisaminnodb
索引類型支持 B-treeFullTexR-tree 索引類型支持 hashB-tree 索引類型,可以通過使用插件 SphinxInnoDB 中獲得全文索引,會慢一點。
索引Myisam 可以不用主鍵InnoDB 表必須有唯一索引(如主鍵)(用戶沒有指定的話會自己找/生產一個隱藏列 Row_id 來充當默認主鍵)
存儲結構每張表存放三個文件:frm:格式定義; MYD(MYData):數據文件; MYI(MYIndex):索引文件。Innodb 存儲文件有 frm:格式定義;ibd :數據文件。表的大小只受限于操作系統文件的大小,一般為 2GB
存儲空間MyISAM 提供 壓縮簡潔行terse row formats),存儲空間較小。InnoDB 的表需要更多的內存和存儲,在主內存中建立專用的緩沖池用于高速緩沖數據和索引,對硬盤和高速緩存的使用量較大。
讀寫緩存MyISAM 沒有緩存管理機制,必須依靠操作系統來管理讀取與寫入的緩存。InnoDB 有讀寫緩存管理機制,不會將被修改的數據頁立即交給操作系統。通常 InnoDB 的數據訪問會比 MyISAM 更有效率。
可移植性、備份由于 MyISAM 的數據是以文件的形式存儲,所以在跨平臺的數據轉移中會很方便。免費的方案可以是拷貝數據文件、備份 binlog,或者用 mysqldump,在數據量達到幾十G的時候就相對痛苦了
恢復MyISAM 遇到錯誤,必須完整掃描全表后才能重建索引,或修正未寫入硬盤的錯誤。修復時間與數據量的多少成正比。InnoDB 可借由回滾機制來恢復程序崩潰非預期結束所造成的數據錯誤 ,修復時間基本都是固定的。
事務不支持,每次查詢具有原子性。支持,具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全型表
AUTO_INCREMENTMyISAM 表可以和其他字段一起建立聯合索引InnoDB 中必須包含只有該字段的索引
只支持表級鎖,selectupdatedeleteinsert 語句都會給表自動加鎖。支持表鎖、(默認)行鎖,行鎖大幅度提高了多用戶并發操作的新能。但是 InnoDB 的行鎖,只是在 WHERE 的主鍵是有效的,非主鍵的 WHERE 都會鎖全表的。
外鍵不支持支持,對一個包含外鍵的 InnoDB表 轉為 MYISAM 會失敗。
快速讀取行數用一個變量保存了整個表的行數,執行 select count(*) from table 語句時只需要讀出該變量即可,速度很快(注意不能加有任何 WHERE 條件)。保存表的具體行數,執行 select count(*) from table 時需要全表掃描。

表級鎖和行級鎖

表級鎖

  • 優點:開銷小,加鎖快;
  • 缺點:粒度大,發生沖突概率高,高容納并發能力低,適合查詢為主的業務

行級鎖

  • 優點:粒度小,發生鎖沖突的概率小,適用于高并發的頻繁表修改,因此 InnoDB 高并發性能優于 MyISAM
  • 缺點:加鎖慢,系統消耗較大。索引不僅緩存自身,也緩存數據,因此 InnoDB 相比 MyISAM 需要更大的內存。

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

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

相關文章

MySQL 事務 | ACID、四種隔離級別、并發帶來的隔離問題、事務的使用與實現

文章目錄事務ACID并發帶來的隔離問題幻讀(虛讀)不可重復讀臟讀丟失更新隔離級別Read Uncommitted (讀未提交)Read Committed (讀已提交)Repeatable Read (可重復讀)Serializable (可串行化)事務的使用事務的實現Redoundo事務 事務指邏輯上的一組操作。 …

MySQL 備份與主從復制

文章目錄備份主從復制主從復制的作用備份 根據備份方法的不同,備份可劃分為以下幾種類型: 熱備(Hot Backup) : 熱備指的是在數據庫運行的時候直接備份,并且對正在運行的數據庫毫無影響,這種方法在 MySQL 官方手冊中又…

C++ 流的操作 | 初識IO類、文件流、string流的使用

文章目錄前言IO頭文件iostreamfstreamsstream流的使用不能拷貝或對 IO對象 賦值條件狀態與 iostate 類型輸出緩沖區文件流fstream類型文件模式文件光標函數tellg() / tellp()seekg() / seekp()向文件存儲內容/讀取文件內容string流istringstreamostringstream前言 我們在使用 …

Hibernate 更新部分更改的字段 hibernate update

Hibernate 中如果直接使用 Session.update(Object o);或則是Session.updateOrUpdate(Object o); 會把這個表中的所有字段更新一遍。 如: ExperClass4k e new ExperClass4k(); e.setTime(time); e.setQ_num(q_num); e.setK(k); if (str "finch_fix")…

C++ 類的行為 | 行為像值的類、行為像指針的類、swap函數處理自賦值

文章目錄概念行為像值的類行為像指針的類概念引用計數動態內存實現計數器類的swap概念swap實現自賦值概念 行為像值的類和行為像指針的類這兩種說法其實蠻拗口的,這也算是 《CPrimer》 翻譯的缺點之一吧。。。 其實兩者的意思分別是: 行為像值的類&am…

C++ 右值引用 | 左值、右值、move、移動語義、引用限定符

文章目錄C11為什么引入右值?區分左值引用、右值引用move移動語義移動構造函數移動賦值運算符合成的移動操作小結引用限定符規定this是左值or右值引用限定符與重載C11為什么引入右值? C11引入了一個擴展內存的方法——移動而非拷貝,移動較之拷…

且談關于最近軟件測試的面試

前段時間有新的產品需要招人,安排和參加了好幾次面試,下面就談談具體的面試問題,在面試他人的同時也面試自己。 面試問題是參與面試同事各自設計的,我也不清楚其他同事的題目,就談談自己設計的其中2道題。 過去面試總是…

C++ 多態 | 虛函數、抽象類、虛函數表

文章目錄多態虛函數重寫重定義(參數不同)協變(返回值不同)析構函數重寫(函數名不同)final和override重載、重寫、重定義抽象類多態的原理虛函數常見問題解析虛函數表多態 一種事物,多種形態。換…

C++ 運算符重載(一) | 輸入/輸出,相等/不等,復合賦值,下標,自增/自減,成員訪問運算符

文章目錄輸出運算符<<輸入運算符>>相等/不等運算符復合賦值運算符下標運算符自增/自減運算符成員訪問運算符輸出運算符<< 通常情況下&#xff0c;輸出運算符的第一個形參是一個 非常量ostream對象的引用 。之所以 ostream 是非常量是因為向流寫入內容會改變…

C++ 重載函數調用運算符 | 再探lambda,函數對象,可調用對象

文章目錄重載函數調用運算符lambdalambda等價于函數對象lambda等價于類標準庫函數對象可調用對象與function可調用對象function函數重載與function重載函數調用運算符 函數調用運算符必須是成員函數。 一個類可以定義多個不同版本的調用運算符&#xff0c;互相之間應該在參數數…

C++ 運算符重載(二) | 類型轉換運算符,二義性問題

文章目錄類型轉換運算符概念避免過度使用類型轉換函數解決上述問題的方法轉換為 bool顯式的類型轉換運算符類型轉換二義性重載函數與類型轉換結合導致的二義性重載運算符與類型轉換結合導致的二義性類型轉換運算符 概念 類型轉換運算符&#xff08;conversion operator&#…

Tomcat中JVM內存溢出及合理配置

Tomcat本身不能直接在計算機上運行&#xff0c;需要依賴于硬件基礎之上的操作系統和一個Java虛擬機。Tomcat的內存溢出本質就是JVM內存溢出&#xff0c;所以在本文開始時&#xff0c;應該先對Java JVM有關內存方面的知識進行詳細介紹。 一、Java JVM內存介紹 JVM管理兩種類型的…

俄羅斯農民乘法 | 快速乘

文章目錄概念概念 俄羅斯農民乘法經常被用于兩數相乘取模的場景&#xff0c;如果兩數相乘已經超過數據范圍&#xff0c;但取模后不會超過&#xff0c;我們就可以利用這個方法來拆位取模計算貢獻&#xff0c;保證每次運算都在數據范圍內。 A 和 B 兩數相乘的時候我們如何利用加…

Linux網絡編程 | socket選項設定 及 網絡信息API

文章目錄讀取和設置 socket 選項SO_REUSEADDRSO_RCVBUF 和 SO_SNDBUFSO_RCVLOWAT 和 SO_SNDLOWATSO_LINGER 選項網絡信息APIgethostbyname 和 gethostbyaddrgetservbyname 和 getservbyportgetaddrinfogetnameinfo讀取和設置 socket 選項 正如 fcntl 系統調用是控制文件描述符…

Linux | 高級I/O函數

文章目錄創建文件描述符的函數pipe函數dup函數、dup2函數讀取或寫入數據readv函數、writev函數零拷貝sendfile函數splice函數tee函數進程間通信——共享內存mmap函數 和 munmap函數控制文件描述符fcntl函數創建文件描述符的函數 pipe函數 不再贅述&#xff0c;詳情見我的另一…

分布式理論:CAP、BASE | 分布式存儲與一致性哈希

文章目錄分布式理論CAP定理BASE理論分布式存儲與一致性哈希簡單哈希一致性哈希虛擬節點分布式理論 CAP定理 一致性&#xff08;Consistency&#xff09;&#xff1a; 在分布式系統中的所有數據副本&#xff0c;在同一時刻是否一致&#xff08;所有節點訪問同一份最新的數據副…

Tomcat服務器性能優化

一、概述 本文檔主要介紹了Tomcat的性能調優的原理和方法。可作為公司技術人員為客戶Tomcat系統調優的技術指南&#xff0c;也可以提供給客戶的技術人員作為他們性能調優的指導手冊。 二、調優分類 由于Tomcat的運行依賴于JVM&#xff0c;從虛擬機的角度我們把Tomcat的調整分為…

分布式系統概念 | 分布式事務:2PC、3PC、本地消息表

文章目錄分布式事務2PC&#xff08;二階段提交協議&#xff09;執行流程優缺點3PC&#xff08;三階段提交協議&#xff09;執行流程優缺點本地消息表&#xff08;異步確保&#xff09;分布式事務 分布式事務就是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分…

數據結構算法 | 單調棧

文章目錄算法概述題目下一個更大的元素 I思路代碼下一個更大元素 II思路代碼132 模式思路代碼接雨水思路算法概述 當題目出現 「找到最近一個比其大的元素」 的字眼時&#xff0c;自然會想到 「單調棧」 。——三葉姐 單調棧以嚴格遞增or遞減的規則將無序的數列進行選擇性排序…

最長下降子序列

文章目錄題目解法DP暴搜思路代碼實現貪心二分思路代碼實現題目 給出一組數據 nums&#xff0c;求出其最長下降子序列&#xff08;子序列允許不連續&#xff09;的長度。&#xff08;類似于lc的最長遞增子序列&#xff09; 示例&#xff1a; 輸入&#xff1a; 6 // 數組元素個…