mysql 的邏輯架構 與 存儲引擎的介紹

来源:https://www.cnblogs.com/-huoxingrenlei-26/archive/2019/10/13/11666518.html
-Advertisement-
Play Games

mysql 的邏輯架構分為三層: 最上層的服務大多數基於網路的客戶端、伺服器的工具或者服務都有類似的架構,比如連接處理,授權認證、安全等 第二層架構:mysql的核心服務功能都在這一層,包括查詢解析,分析,優化,緩存以及所有的內置函數,所有跨存儲引擎的功能都在這一層實現:存儲過程,觸發器、視圖 第三 ...


mysql 的邏輯架構分為三層:

最上層的服務大多數基於網路的客戶端、伺服器的工具或者服務都有類似的架構,比如連接處理,授權認證、安全等

第二層架構:mysql的核心服務功能都在這一層,包括查詢解析,分析,優化,緩存以及所有的內置函數,所有跨存儲引擎的功能都在這一層實現:存儲過程,觸發器、視圖

第三層:包含存儲引擎。負責數據的存儲和提取,innoDB是個例外,它會解析外鍵定義,因為mysql伺服器本身沒有實現該功能

連接管理與安全性:

當客戶端連接到mysql伺服器是,伺服器需要對其進行認證,認證基於用戶名,原始主機信息和密碼,一旦客戶端連接成功,伺服器 會繼續驗證該客戶端是否具有執行某個特定查詢的許可權

優化與執行:

mysql會解析查詢,並創建內部數據結構(解析樹),然後對其進行各種優化,包括重寫查詢,決定表的讀取順序,以及選擇合適的索引,用戶可以通過特殊的關鍵字提示優化器,影響他的決策過程,也可以請求優化器解釋優化過程的各個因素,使yoghurt可以知道伺服器是如何進行優化決策的,並提供一個參考基準,便於用戶重構查詢和修改相關配置,優化查詢效率

存儲引擎對於優化查詢時有影響的

對於select語句,在解析查詢之前,伺服器會先檢查緩存,如果能找到對應的查詢,伺服器就不會再執行查詢解析,優化和執行的整個過程,而是直接返回查詢結果

併發控制:

只要有多個查詢需要在同一時刻修改數據,都會產生併發控制的問題。

如果應用鎖可以保證數據的完整性,不被破壞,但是並不支持併發處理。

兩個層面的併發控制:伺服器層和存儲引擎層

讀寫鎖:通過實現一個由兩種類型的鎖組成的鎖系統來解決問題,也稱作共用鎖和排它鎖或者讀鎖和寫鎖

讀鎖是共用的,互相不阻塞的,而寫鎖則是排他的,

鎖粒度:一種提高共用資源併發性的方式就是讓鎖定對象更有選擇性,儘量只鎖定需要修改的部分數據,而不是所有資源。更理想的方式是,是對會修改的數據片進行精確的鎖定,

在任何時候,在給定的資源上,鎖定的數據量越少,則系統的併發程度越高,只要相互之間不發生衝突即可

所謂的鎖策略,就是在鎖的開銷和數據的安全性之間尋求平衡,大多數商業資料庫系統沒有提供能多的選擇,一般都是在表上施加行級鎖,而mysql則提供了多種選擇,每種mysql存儲引擎都可以實現自己的鎖策略和鎖粒度

表鎖:

鎖開銷最小的策略,會鎖定整張表,寫鎖也比讀鎖優先順序更高,一個寫鎖請求可能會被插入到讀鎖隊列的前面

行級鎖:

最大程度地支持併發處理,同時也帶來最大的鎖開銷,行級鎖只在存儲引擎層實現,伺服器層沒有實現,所有的引擎都以自己的方式實現了鎖

事務:ACID

atomicity consistency isolation durability

每種存儲引擎實現的隔離級別不盡相同

四種隔離級別:innodb引擎支持所有隔離級別

read uncommitted:未提交讀,事務可以讀取未提交的數據,臟讀(很少使用)

read committed:提交讀,大多數資料庫系統的預設隔離級別都是read committed,但mysql不是,這和個級別有時候也叫做不可重覆讀,兩次執行同樣的查詢可能會得到不一樣的結果

repeatable read:可重覆讀,是mysql的預設事務隔離級別,該級別保證了在同一個事務中多次讀取同樣的記錄結果是一致的。但是無法解決另外一個幻讀問題。幻讀指的是當某個事務在讀取某個範圍內的記錄時,另外一個事務又在該範圍內插入了新的記錄,檔之前的事務再次讀取該範圍的記錄時,會產生幻行。

innodb和xtradb存儲引擎通過多版本併發控制解決了幻讀的問題。

serializable:可串列化,最高的隔離級別,強制事務串列執行,避免幻讀問題。也很少用。

事務日誌;

幫助提高事務的效率,使用事務日誌,存儲引擎在修改表的數據時只需要修改其記憶體拷貝,再把該修改行為記錄到持久在硬碟上的事務日誌中,而不用每次都將修改的數據本身持久到磁碟,事務日誌採用的追加的方式,因此寫日誌的操作時磁碟上一小塊區域內的順序I/O操作,而不像隨機I/O需要在磁碟的多個地方移動磁頭,所以採用事務日誌的方式相對來說快的多

修改數據需要寫兩次磁碟

mysql中的事務

兩種事務型的存儲引擎:innodb和NDB Cluster

SET AUTOCOMMIT = 0 ;設置禁用自動提交模式,修改AUTOCOMMIT對本身就是非事務型的表,不會有任何影響。

有些命令在執行之前會強制執行commit提交當前的活動事務。

SET TRANSACTION ISOLATION LEVEL read committed;設置隔離級別。可以在配置文件中設置整個資料庫的隔離級別,也可以只改變當前會話的隔離級別

在事務中混合使用存儲引擎

mysql伺服器層不管理事務,事務是由下層的存儲引擎實現的,所以在同一個事務中,使用多種存儲引擎是不可靠的

MVCC:多版本併發控制

innodb的mvcc:通過在每行記錄後面保存兩個隱藏的列來實現的,一個列保存了行的創建時間,一個保存行的過期時間(刪除時間),存儲的並不是實際的時間值,而是系統版本號。每開始一個新的事務,系統版本號都會自動遞增。

不同的存儲引擎保存數據和索引的方式是不同的,但表的定義則是在mysql服務層統一處理的

SHOW TABLE STATUS LIKE 'user';顯示相關表信息

innodb是mysql的預設事務型引擎,被設計用來處理大量的短期事務,短期事務大部分情況是正常提交的,很少會被回滾,

innodb

innodb基於聚簇索引建立,innodb的索引結構和mysql的其他存儲引擎有很大的不同,聚簇索引對主鍵查詢有很高的性能,不過它的二級索引中必須包含主鍵列,若表上的索引較多的話,主鍵應當儘可能小。存儲格式是平臺獨立的,可移植。崩潰後可安全恢復

myisam存儲引擎;崩潰後無法恢復。支持數據修複,支持全文索引,基於分詞創建的索引,對整張表加鎖,寫鎖具有排他性,讀鎖共用,不能很好的支持高併發

Memory引擎:基於記憶體,所以不保存數據 ,支持hash索引,是表級鎖,併發寫入性能較低, 應用場景:用於保存數據分析中產生 的中間數據,用於查找或者映射表,MySQL在執行查詢的過程中需要使用臨時表來保存中間結果,內部使用的臨時表就是memory表。

NDB cluster引擎:

mysql伺服器、NDB集群存儲引擎,以及分散式的,share-nothing的,容災的,高可用的NDB資料庫的組合,被稱為mysql集群。

第三方存儲引擎:

OLTP:XtraDB是基於innodb引擎的一個改進版本,可以作為innodb的一個完全的替代產品。

另外還有一些和innodb非常類似的OLTP類存儲引擎,比如都支持acid事務和mvcc,其中一個就是pbxt。對固態存儲ssd提供了適當的支持。

tokudb引擎使用了一種新的叫做分形樹的索引數據結構,該結構是緩存無關的,因此即使其大小超過記憶體性能也不會下降,是一種大數據存儲引擎,因為擁有很高的壓縮比,可以在很大的數據量上創建大量索引 。

面向列的存儲引擎:

mysql預設是面向行的,伺服器的查詢也是以行為單位處理的,

infobright是最有名的面向列的存儲引擎,在非常的數據量(數十TB)時,該引擎工作良好。視為數據分析和數據倉庫應用設計的。數據高度壓縮,按照塊進行排序,每個塊都對應一組元數據。訪問元數據即可決定是否跳過該塊,該引擎不支持縮影。

參考文獻《高性能mysql》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、開機菜單是 移動游標到第一行 --敲擊e 2、找到UTF-8,加上空格rd.break,敲擊ctrl+x 3、輸入以下命令 ...
  • 系統創建新線程時,會同時創建與這個線程相關聯的隊列,即非同步過程調用(APC)的隊列。 一些非同步操作可以通過加入APC來實現,比如我現在學習的IO請求/完成。 IO完成時,系統向該線程的APC隊列中加入一項,包含lpCompleteionRoutine和lpOverlapped。當線程處於非執行態且是 ...
  • 避免衝突(Mark as Merged) 如果存在衝突的文件,系統會對其進行更高安全性能的保護。 需要開發人員確認衝突已經排除之後,用滑鼠右鍵單擊該文件,選擇 Mark as Merged命令,該命令標明文件已經過開發人員的驗證,衝突 已經被避免。之後才可用Commit 命令進行提交 ...
  • 優秀文章 https://blog.csdn.net/qq_38351824/article/details/82619734 一、STM32通用定時器(TIM2、TIM3、TIM4和TIM5共四個通用定時器,它們之間完全獨立,不共用任何資源) STM32F1系列的通用定時器是一個通過可編程預分頻器 ...
  • 1.本地Navicat for MySQL無法連接至伺服器(Centos 7 x86_64 bbr) 2.部署到伺服器上後(Centos 7 x86_64 bbr)表單提交亂碼問題 ...
  • 環境準備: master:192.168.0.106:3306slave:192.168.0.105:3306 主和從都必須配置有唯一的ID(server_id:建議ip最後一組+MySQL埠號,例如:1063306,1053306) 採用gtid模式複製,需要配置mysqld開啟以下兩個參數 操 ...
  • 此題有兩個解法: 我初步嘗試用以下 解決問題(要刪除的記錄 肯定大於相同內容的 ): 但是無法通過,究其原因是在 語句中, 與`DELETE`操作不能同時存在. 答案一 因此嘗試新的解法,直接使用刪除語句,結果如下所示: 此答案通過測試,但是效率較低. 答案二 後續思考中發現,可以使用臨時表解決 與 ...
  • 前言 Redis 沒有直接使用 C 語言傳統的字元串表示(以空字元結尾的字元數組,以下簡稱 C 字元串), 而是自己構建了一種名為簡單動態字元串(simple dynamic string,SDS)的抽象類型, 並將 SDS 用作 Redis 的預設字元串表示。 個人感覺SDS類似於Java的Arr ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...