讀高性能MySQL(第4版)筆記01_MySQL架構(上)

来源:https://www.cnblogs.com/lying7/archive/2023/08/15/17627397.html
-Advertisement-
Play Games

![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230813220820722-927556191.png) # 1. 邏輯架構 ## 1.1. 大多數基於網路的客戶端/伺服器工具或伺服器都有類似的服務 ### 1.1.1. ...


1. 邏輯架構

1.1. 大多數基於網路的客戶端/伺服器工具或伺服器都有類似的服務

1.1.1. 連接處理

1.1.2. 身份驗證

1.1.3. 確保全全性

1.2. 核心層

1.2.1. 查詢解析、分析、優化、以及所有的內置函數

1.2.2. 跨存儲引擎的功能

1.2.2.1. 存儲過程

1.2.2.2. 觸發器

1.2.2.3. 視圖

1.3. 存儲引擎層

1.3.1. 存儲引擎負責MySQL中數據的存儲和提取

1.3.2. 和GNU/Linux下的各種文件系統一樣,每種存儲引擎都有其優勢和劣勢

1.3.3. 優化器並不關心表使用的是什麼存儲引擎,但存儲引擎對於查詢優化是有影響的

2. 查詢緩存

2.1. query cache

2.2. 隨著併發性的增加,查詢緩存成為一個讓人詬病的瓶頸

2.3. MySQL 5.7.20版本開始,查詢緩存已經被官方標註為被棄用的特性

2.4. 在8.0版本中被完全移除

2.5. 緩存被頻繁請求的結果集依然是一個很好的實踐

2.5.1. 一個流行的設計模式是在memcached或Redis中緩存數據

3. 併發控制

3.1. 只要有多個查詢需要同時修改數據,就會產生併發控制問題

3.2. 併發控制的級別

3.2.1. 伺服器級別

3.2.2. 存儲引擎級別

3.3. 讀寫鎖

3.3.1. 從電子錶格中讀取數據不會有什麼麻煩,即使很多人同時讀取也不會有問題

3.3.2. 讀鎖(read lock)

3.3.2.1. 共用鎖(shared lock)

3.3.2.2. 資源上的讀鎖是共用的,或者說是相互不阻塞的

3.3.3. 寫鎖(write lock)

3.3.3.1. 排他鎖(exclusive lock)

3.3.3.2. 寫鎖則是排他的,也就是說,一個寫鎖既會阻塞讀鎖也會阻塞其他的寫鎖

3.3.3.3. 只有這樣才能確保在特定的時間點只有一個客戶端能執行寫入,並防止其他客戶端讀取正在寫入的資源

3.3.3.3.1. 這是出於安全策略的考慮

3.3.4. 處理併發讀/寫訪問的系統通常實現一個由兩種鎖類型組成的鎖系統

3.3.5. 在實際的資料庫系統中,每時每刻都在發生鎖定

3.3.6. 如果資料庫伺服器以可接受的方式執行,鎖的管理速度足夠快,那麼不會引起客戶端的感知

3.3.7. 鎖是資料庫實現一致性保證的方法

3.4. 鎖的粒度

3.4.1. 一種提高共用資源併發性的方式就是讓鎖定對象更有選擇性

3.4.2. 儘量只鎖定包含需要修改的部分數據,而不是所有的資源

3.4.3. 只對需要修改的數據片段進行精確的鎖定

3.4.4. 讓鎖定的數據量最小化,理論上就能保證在給定資源上同時進行更改操作,只要被修改的數據彼此不衝突即可

3.4.5. 如果系統花費大量的時間來管理鎖,而不是存取數據,那麼系統的性能可能會受影響

3.5. 鎖策略

3.5.1. 鎖定策略是鎖開銷和數據安全性之間的平衡,這種平衡會影響性能

3.5.2. 表鎖(table lock)

3.5.2.1. MySQL中最基本也是開銷最小的鎖策略

3.5.2.2. 它會鎖定整張表

3.5.2.2.1. 只有沒有人執行寫操作時,其他讀取的客戶端才能獲得讀鎖,讀鎖之間不會相互阻塞

3.5.2.3. 寫鎖隊列和讀鎖隊列是分開的,但寫鎖隊列的優先順序絕對高於讀隊列

3.5.3. 行級鎖(row lock)

3.5.3.1. 行級鎖是在存儲引擎而不是伺服器中實現的

3.5.3.2. 可以最大程度地支持併發處理(也帶來了最大的鎖開銷)

3.5.3.3. 允許多人同時編輯不同的行,而不會阻塞彼此

3.5.3.4. 一般都是在表中施加行級鎖(row level lock),為了在鎖比較多的情況下儘可能地提供更好的性能,鎖的實現方式非常複雜

3.5.3.5. 伺服器可以執行更多的併發寫操作

3.5.3.6. 代價是需要承擔更多開銷

3.5.3.6.1. 跟蹤誰擁有這些行級鎖
3.5.3.6.2. 已經鎖定了多長時間
3.5.3.6.3. 行級鎖的類型
3.5.3.6.4. 何時該清理不再需要的行級鎖

4. 事務

4.1. 事務就是一組SQL語句,作為一個工作單元以原子方式進行處理

4.2. 作為事務的一組語句,要麼全部執行成功,要麼全部執行失敗

4.3. 存在高度複雜且緩慢的兩階段提交系統的典型原因

4.3.1. 為了應對各種失敗場景

4.3.1.1. 連接可能會斷開

4.3.1.2. 會超時

4.3.1.3. 資料庫伺服器在操作執行過程中會崩潰

4.4. ACID

4.4.1. 原子性(atomicity)

4.4.1.1. 一個事務必須被視為一個不可分割的工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾

4.4.2. 一致性(consistency)

4.4.2.1. 資料庫總是從一個一致性狀態轉換到下一個一致性狀態

4.4.3. 隔離性(isolation)

4.4.3.1. 一個事務所做的修改在最終提交以前,對其他事務是不可見的,這就是隔離性帶來的結果

4.4.4. 持久性(durability)

4.4.4.1. 一旦提交,事務所做的修改就會被永久保存到資料庫中

4.4.4.2. 不可能有100%的持久性保障

4.4.4.3. 如果資料庫本身就能做到真正的持久性,那麼備份又怎麼能增加持久性?

4.4.5. ACID事務和InnoDB引擎提供的保證是MySQL中最強大、最成熟的特性之一

4.4.6. 除非系統通過嚴格的ACID測試,否則空談事務的概念是不夠的

4.5. 隔離級別

4.5.1. READ UNCOMMITTED(未提交讀)

4.5.1.1. 在事務中可以查看其他事務中還沒有提交的修改

4.5.1.2. 從性能上來說,READ UNCOMMITTED不會比其他級別好太多,卻缺乏其他級別的很多好處

4.5.1.3. 在實際應用中一般很少使用

4.5.1.4. 讀取未提交的數據,也稱為臟讀(dirty read)

4.5.2. READ COMMITTED(提交讀)

4.5.2.1. 大多數資料庫系統的預設隔離級別是READ   COMMITTED

4.5.2.1.1. MySQL不是

4.5.2.2. 一個事務可以看到其他事務在它開始之後提交的修改

4.5.2.3. 在該事務提交之前,其所做的任何修改對其他事務都是不可見的

4.5.2.4. 允許不可重覆讀(nonrepeatable read)

4.5.2.4.1. 這意味著同一事務中兩次執行相同語句,可能會看到不同的數據結果

4.5.3. REPEATABLE READ(可重覆讀)

4.5.3.1. MySQL預設的事務隔離級別

4.5.3.2. 保證了在同一個事務中多次讀取相同行數據的結果是一樣的

4.5.3.3. 無法解決另外一個幻讀(phantom read)

4.5.3.4. 幻讀指的是當某個事務在讀取某個範圍內的記錄時,另外一個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生幻行(phantom row)

4.5.3.5. InnoDB和XtraDB存儲引擎通過多版本併發控制(MVCC,Multiversion Concurrency Control)解決了幻讀的問題

4.5.4. SERIALIZABLE(可串列化)

4.5.4.1. 最高的隔離級別

4.5.4.2. 通過強制事務按序執行,使不同事務之間不可能產生衝突,從而解決了幻讀問題

4.5.4.3. 實際應用中很少用到這個隔離級別,除非需要嚴格確保數據安全且可以接受併發性能下降的結果

4.5.5. 隔離級別之間的利與弊

5. 死鎖

5.1. 兩個或多個事務相互持有和請求相同資源上的鎖,產生了迴圈依賴

5.2. InnoDB存儲引擎,檢測到迴圈依賴後會立即返回一個錯誤信息

5.2.1. 死鎖將表現為非常緩慢的查詢

5.3. 一旦發生死鎖,如果不回滾其中一個事務(部分或全部),就無法打破死鎖

5.4. InnoDB目前處理死鎖的方式是將持有最少行級排他鎖的事務回滾

5.4.1. 這是一種最容易回滾的近似演算法

5.5. 死鎖的產生有雙重原因

5.5.1. 真正的數據衝突,這種情況通常很難避免

5.5.2. 完全是由於存儲引擎的實現方式導致的


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

-Advertisement-
Play Games
更多相關文章
  • Quartz由Java編寫的功能豐富的開源作業調度框架,可以集成到幾乎任何Java應用程式中,並且能夠創建多個作業調度; ...
  • ## 引言 深拷貝是指創建一個新對象,該對象的值與原始對象完全相同,但在記憶體中具有不同的地址。這意味著如果您對原始對象進行更改,則不會影響到複製的對象 常見的C#常見的深拷貝方式有以下4類: 1. 各種形式的序列化及反序列化。 2. 通過反射機制獲取該對象的所有欄位和屬性信息。遍歷所有欄位和屬性,遞 ...
  • 鴿了好久的內容,終於補上了。這篇文章對該合集前幾篇文章的內容做了簡要的總結和應用,同時按照MVVM設計模式完成了一個學習小Demo,希望可以幫到正在學習的友友們。有什麼問題可以評論區留言討論。 ...
  • # Unity AssetPostprocessor的Model的動畫相關的函數修改實際應用 在Unity中,AssetPostprocessor是一個非常有用的工具,它可以在導入資源時自動執行一些操作。其中,Model的動畫相關的函數修改可以幫助我們在導入模型時自動修改動畫相關的函數,從而提高我們 ...
  • 最近一段時間沒有看 docker desktop,忽然想起來打開看看,結果死活啟動不了。以前卸載之後,重新安裝就好了,同樣的方法嘗試了很多次還是不太行,重啟也不行... 後來想想是不是 wsl 出了問題,運行 WSA ,WSAClient 啟動後又自動退出了。在命令行下運行 wsl,等待了很久,出現 ...
  • WindowsServer伺服器管理技巧:對於使用WindowsServer伺服器開發人員或者運維人員初學者來說,可能會遇到很多問題,比如:如何設置允許多用戶同時登錄伺服器?如何開啟伺服器防火牆?Windows如何配置SSH遠程登錄?等等,如果遇到了這些問題,來看看這篇文章就能解決啦! ...
  • 國產銀河麒麟系統也是生產環境上經常遇到的(官網簡介:銀河麒麟高級伺服器操作系統V10 - 國產操作系統、銀河麒麟、中標麒麟、開放麒麟、星光麒麟——麒麟軟體官方網站 (kylinos.cn)) 這版系統分為伺服器版和個人桌面版;其中伺服器版命令估計是基於紅帽體系;而桌面版命令估計是基於Ubuntu,很 ...
  • 設計字元設備 文件系統調用系統IO的內核處理過程 inode索引節點是文件系統中的一種數據結構,用於存儲文件的元數據信息,包括文件的大小、訪問許可權、創建時間、修改時間等。每個文件在文件系統中都對應著一個唯一的inode節點,通過inode節點可以查找到文件的實際數據塊的位置。inode節點通常存儲在 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...