1 MySql基礎介紹

来源:https://www.cnblogs.com/knowledgeispower/archive/2023/03/09/17198402.html
-Advertisement-
Play Games

1 mysql邏輯架構 mysql邏輯架構圖: Mysql伺服器、存儲引擎 是兩個獨立的組件,彼此通過api交互 第一層:連接處理、授權認證、安全管理 第二層:核心服務功能 查詢解析、分析、優化、緩存以及所有的內置函數(日期、時間、數學、加密函數等) 跨存儲引擎的功能:存儲過程、觸發器、視圖等。 第 ...


目錄

1 mysql邏輯架構

mysql邏輯架構圖:

Mysql伺服器、存儲引擎 是兩個獨立的組件,彼此通過api交互

  1. 第一層:連接處理、授權認證、安全管理
  2. 第二層:核心服務功能
    1. 查詢解析、分析、優化、緩存以及所有的內置函數(日期、時間、數學、加密函數等)
    2. 跨存儲引擎的功能:存儲過程、觸發器、視圖等。
  3. 第三層:存儲引擎,負責MySQL中數據的存儲和提取。
    1. 伺服器通過API與存儲引擎進行通信。
    2. 存儲引擎不會去解析SQL,不同存儲引擎之間也不會相互通信,僅響應上層伺服器的請求。

1.1 連接管理與安全性

  1. 伺服器為每個客戶端單獨開闢一個線程(或線程池(少量線程)以應對大量連接),處理來自該客戶端的所有連接。
  2. 認證方式:
    1. 用戶名+密碼+主機信息(ip 埠)
    2. 安全套接字SSL (後續章節詳解 todo)
  3. 連接許可權校驗

1.2 優化與執行

優化器工作內容:

  1. 先解析查詢,並創建解析樹,再優化,如:重寫查詢、決定表的讀取順序、選擇合適的索引等。使用【優化器解釋explain】來查看其優化內容
  2. 優化器並不關心表使用什麼存儲引擎,但存儲引擎對於優化查詢有影響:優化器會請求存儲引擎提供容量或某個具體操作的開銷信息,以及表數據的統計信息等。
  3. 對於SELECT語句,在解析查詢之前,伺服器會先檢查查詢緩存,如果能夠在其中找到對應的查詢,伺服器就不必再執行查詢解析、優化和執行的整個過程,而是直接返回查詢緩存中的結果集。

2 併發控制

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

2.1 鎖粒度

  1. 每個存儲引擎都可以實現自己的鎖策略和鎖粒度。
  2. 兩種基本鎖粒度:表鎖、行級鎖

2.2 表鎖

  1. Mysql最基本的鎖策略,也是開銷最小的策略。它會鎖定整張表。對錶進行寫操作前,需先獲得寫鎖。讀寫互斥,讀讀不互斥
  2. 寫鎖比讀鎖有更高的優先順序,一個寫鎖請求可能會被插入到讀鎖隊列的前面(反之讀鎖則不能插入到寫鎖的前面)。
  3. 儘管存儲引擎可以管理自己的鎖,MySQL伺服器還是會使用各種有效的表鎖來實現不同
    的目的。例如,Mysql伺服器會為諸如ALTER TABLE之類的語句使用表鎖,而忽略存儲引擎的鎖機制

2.3 行級鎖

  1. 只在存儲引擎層實現,而MySQL伺服器層沒有實現。
  2. 併發性好,但鎖開銷大

3 事務

3.1 資料庫事務四特性

事務是指一組邏輯操作,它們要麼一起成功,要麼一起失敗。

ACID:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)

  1. 原子性:事務是一個不可分割的最小單元,事務中的操作要麼都發生,要麼都不發生。
  2. 一致性:如果事務執行之前資料庫是一個完整的狀態,那麼事務結束後(無論事務是否執行成功)資料庫仍然是一個完整的狀態。(DB中所有的數據都符合DB的約束規範)
  3. 隔離性:多個用戶併發訪問資料庫時,一個用戶的事務不能被其他用戶的事務所干擾,多個併發事務之間數據要相互隔離。
  4. 持久性:事務一旦被提交,它對資料庫的影響是永久性的

3.2 隔離級別

SQL標準定義了四種隔離級別:

隔離級別 說明 問題
讀未提交(Read Uncommitted) 事務A可讀取事務B未提交的數據 引發 臟讀
讀已提交(Read Committed) 事務A只能讀取其它已提交事務的數據; 引發 不可重覆讀
可重覆讀(Repeatable Read) 保證同一事務中多次讀取同樣的記錄的結果是一致的;Mysql預設事務隔離級別 解決了臟讀;但引發 幻讀
可串列化(Serializable) 強制事務串列執行,在讀的每一行數據行上加鎖 大量的超時和鎖競爭
  • 臟讀:一個事務讀取了另外一個未提交事務數據

  • 不可重覆讀取:在當前事務中,讀取了另一事務提交的更新或者刪除的數據。異常情形:同一事務先後執行相同的select語句時可能看到不一樣的結果

  • 幻讀:當事務A在讀取某個範圍內的記錄時,事務B又在該範圍內插入了新的記錄,當事務A再次讀取該範圍的記錄時,會產生幻行(讀取到新插入的記錄);多版本控制(MVVC)解決幻讀

總結:

3.3 死鎖

資料庫系統實現了多種鎖檢測和死鎖超時機制:

  1. 方式一:當檢測到死鎖的迴圈依賴,立即返回一個錯誤。
  2. 方式二:當查詢的時間達到鎖等待超時的設定值後,放棄鎖請求
  3. InnoDB處理死鎖的方法:將持有最少行級排他鎖的事務進行回滾

3.4 事務日誌

事務日誌的目的是提交事務效率。

  1. 首先資料庫的數據可以被緩存到記憶體
  2. 修改表數據時,會先修改記憶體中的數據,再把該修改行為以追加的方式記錄到事務日誌
  3. 事務日誌保存到磁碟後,後臺線程稍後把修改的數據刷新到磁碟
  4. 它是一種預寫日誌策略(write ahead logger),修改數據需要寫兩次磁碟

3.5 MySql中的事務

一、自動提交

預設採用自動提交模式(auto commit)

  1. 自動提交模式:如果不是顯式地開啟一個事務,那麼每一條sql指令都會當做一個事務來執行
  2. 非自動提交模式:所有sql指令都在一個事務中,直到顯式地執行COMMIT提交或者ROLLBACK回滾,該事務結束,同時又開始了新的事務。

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

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

三、隱式和顯式鎖定
todo

4 多版本併發控制MVCC

目標:減少不必要的鎖操作

實現原理:

一、兩個前提:

  1. 每個事務開始之前,會以遞增方式生成一個系統版本號。以下簡稱:VNum
  2. 在每一行記錄增加兩個隱藏列:一個保存行的創建時間、一個保存行的刪除時間。這兩個時間概念用系統版本號來代替

二、對於不同的sql指令,InnoDB執行不同的操作:

INSERT: 為新插入的每一行保存VNum作為行版本號。
DELETE:為刪除的每一行保存VNum作為行刪除標識。
UPDATE:為插入一行新記錄,保存VNum作為行版本號,同時保存VNum到原來的行作為行刪除標識。
SELECT
InnoDB會根據以下兩個條件檢查每行記錄:

  1. 只查找版本早於當前事務版本的數據行(也就是,行的系統版本號小於或等於事務的系統版本號),這樣可以確保事務讀取的行,要麼是在事務開始前已經存在的,要麼是事務自身插入或者修改過的。
  2. 行的刪除版本要麼未定義,要麼大於當前事務版本號。這可以確保事務讀取到的行,在事務開始之前未被刪除。

只有符合上述兩個條件的記錄,才能返回作為查詢結果。

溫馨提示:資料庫的刪除、更新,跟淺義上的理解不一樣:1、delete並非把數據從磁碟刪除;update它是先插入後刪除。在後續學習筆記會對此進行更深入講解。

5 MySql常用存儲引擎

5.1 InnoDB

  • InnoDB採用MVCC來支持高併發,實現了四個標準的隔離級別,預設級別:REPEATABLE READ (可重覆讀)
  • 通過間隙鎖(next-key locking)策略防止幻讀的出現 (後續章節詳解 todo)
  • InnoDB的表是基於聚族索引建立 (後續章節詳解 todo)
  • 存儲格式是平臺獨立,可以將數據和索引文件跨平臺複製。
  • 其它優化:可預測性預讀、自適應hash索引、插入緩衝區等 (後續章節詳解 todo)
  • 支持真正熱備份 (後續章節詳解 todo)

5.2 MyISAM

不支持:事務、行級鎖、奔潰後安全恢復
適用於:表比較小、讀多寫少的場景

特性:

一、加鎖與併發
對整張表加鎖,而不是針對行。讀取時會對需要讀到的所有表加共用鎖,寫入時則對錶加排他鎖。在表有讀取查詢的同時,也可以往表中插入新的記錄(併發插人)
二、奔潰修複
崩潰後無法安全恢復
三、索引特性
支持全文索引:對於MyISAM表,即使是BL0B和TEXT等長欄位,也可以基於其前500個字元創建索引

6 InnoDB如何使用MVCC解決幻讀

後續章節詳解 todo
可參照:InnoDB事務模型和鎖定


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

-Advertisement-
Play Games
更多相關文章
  • 一、什麼是Vim Vim是一個類似於Vi的著名的功能強大、高度可定製的文本編輯器,在Vi的基礎上改進和增加了很多特性。代碼補全、編譯及錯誤跳轉等方便編程的功能特別豐富,在程式員中被廣泛使用。和Emacs併列成為類Unix系統用戶最喜歡的文本編輯器。 二、Vim鍵點陣圖 三、Vim的三種模式 Vim 有 ...
  • 一、引言 在之前圍繞STM32的GPIO的基本結構進行了介紹,圖1為STM32的5V容忍的GPIO口內部基本結構圖,圖2為GPIO的基本結構中各個模塊部分的概述。 閱讀GPIO基本結構的內容能夠對GPIO的工作模式有更深的瞭解。正是由於GPIO的結構中包含了多樣性的電路和模塊,因此進行合理的配置組合 ...
  • 1 文件目錄指令 1 pwd 顯示當前目錄的絕對路徑。 說明當前位置在/home/sora 2 cd 切換到指定目錄。 cd ~ 切換到當前用戶的家目錄:如果當前用戶為root,會切換到/root/,如果當前用戶為普通用戶名字叫做A,會切換到/home/A/。 cd .. 切換到上一級目錄 3 mk ...
  • 可以使用以下方法將Win32視窗設置為透明: 定義視窗類時,在WNDCLASSEX結構體中設置hbrBackground成員為NULL。 在視窗創建時,使用WS_EX_LAYERED風格和SetLayeredWindowAttributes函數將視窗設置為透明: HWND hwnd = Create ...
  • 1 系統運行級別 0:關機1:單用戶【找回丟失密碼】 2:多用戶狀態沒有網路服務3:多用戶狀態有網路服務 4:系統未使用保留給用戶5:圖形界面 6:系統重啟 其中,最常用的為3和5。 有關命令: (1)init :切換不同運行狀態 從 圖形界面 切換 為多用戶狀態有網路服務。 (2)systemct ...
  • 更好地提高效率一直以來是袋鼠雲數棧產品的主要目標之一。當前數棧客戶的實時任務都是基於 Per-Job 模式運行的,客戶在進行一些任務參數的修改之後,只能先取消當前任務,再選擇 CheckPoint 恢復或者重新運行,整個過程需要3-5分鐘,比較浪費時間。為了達到提高效率的目的,我們針對 Per-Jo ...
  • 摘要:本文簡單介紹sequence的使用場景及如何修改sequence的cache值提高性能。 本文分享自華為雲社區《GaussDB(DWS)關於sequence的那些事》,作者:Arrow0lf 。 什麼是sequence sequence,也稱作序列,是用來產生唯一整數的資料庫對象。序列的值按照 ...
  • 導讀 本文將介紹網易數帆在數據治理方面的一些總結和思考。文章將圍繞以下三點展開: 1. 數據治理解決了什麼問題 2. 數據治理體系 3. 淺談數據治理的實現 01數據治理解決了什麼問題 首先看一下數據治理解決了什麼問題,可以總結為六個方面: 1. 數據開發與數據治理脫節 在許多企業中存在這樣一個現象 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...