讀高性能MySQL(第4版)筆記02_MySQL架構(下)

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

![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230815092340479-67825278.png) # 1. 事務日誌 ## 1.1. 事務日誌有助於提高事務的效率 ### 1.1.1. 存儲引擎只需要更改記憶體中的數 ...


1. 事務日誌

1.1. 事務日誌有助於提高事務的效率

1.1.1. 存儲引擎只需要更改記憶體中的數據副本,而不用每次修改磁碟中的表,這會非常快

1.1.2. 更改的記錄寫入事務日誌中,事務日誌會被持久化保存在硬碟上

1.2. 事務日誌採用的是追加寫操作,是在硬碟中一小塊區域內的順序I/O,而不是需要寫多個地方的隨機I/O,所以寫入事務日誌是一種相對較快的操作

1.3. 大多數使用這種技術(write-ahead logging,預寫式日誌)的存儲引擎修改數據最終需要寫入磁碟兩次

1.4. 如果修改操作已經寫入事務日誌,那麼即使系統在數據本身寫入硬碟之前發生崩潰,存儲引擎仍可在重新啟動時恢復更改

2. MySQL中的事務

2.1. 自動提交模式

2.1.1. AUTOCOMMIT

2.1.2. 通過禁用此模式,可以在事務中執行一系列語句,併在結束時執行COMMIT提交事務或ROLLBACK回滾事務

2.2. 可以使用SET命令設置AUTOCOMMIT變數來啟用或禁用自動提交模式

2.2.1. 啟用可以設置為1或者ON

2.2.2. 禁用可以設置為0或者OFF

2.3. AUTOCOMMIT=0,則當前連接總是會處於某個事務中,直到發出COMMIT或者ROLLBACK,然後MySQL會立即啟動一個新的事務

2.4. 除了在禁用AUTOCOMMIT的事務中可以使用之外,其他任何時候都不要顯式地執行LOCK TABLES,不管使用的是什麼存儲引擎

2.5. 執行SET TRANSACTION ISOLATION LEVEL命令來設置隔離級別

2.5.1. 新的隔離級別會在下一個事務開始的時候生效

2.5.2. 最好在伺服器級別設置最常用的隔離,並且只在顯式情況下修改

2.6. MySQL不在伺服器層管理事務,事務是由下層的存儲引擎實現的

2.6.1. 在同一個事務中,混合使用多種存儲引擎是不可靠的

2.6.2. 為每張表選擇合適的存儲引擎,並不惜一切代價避免在應用中混合使用存儲引擎是非常重要的

2.6.3. 在非事務表中執行事務相關操作的時候,MySQL通常不會發出提醒,也不會報錯

2.6.4. 最好不要在應用程式中混合使用存儲引擎

2.6.4.1. 失敗的事務可能導致不一致的結果,因為某些部分可以回滾,而其他部分不能回滾

2.7. InnoDB使用兩階段鎖定協議

2.7.1. two-phase locking protocol

2.7.2. 在事務執行期間,隨時都可以獲取鎖

2.7.3. 但鎖只有在提交或回滾後才會釋放,並且所有的鎖會同時釋放

2.8. InnoDB還支持通過特定的語句進行顯式鎖定

2.8.1. 不屬於SQL規範

2.9. 支持LOCK TABLES和UNLOCK TABLES命令,這些命令在伺服器級別而不在存儲引擎中實現

2.10. 應該使用支持事務的存儲引擎

2.10.1. InnoDB支持行級鎖,所以沒必要使用LOCKTABLES

3. 多版本併發控制

3.1. MVCC

3.2. 行級鎖的一個變種

3.2.1. 在很多情況下避免了加鎖操作,因此開銷更低

3.2.2. 不僅實現了非阻塞的讀操作,寫操作也只鎖定必要的行

3.3. Undo日誌寫入是伺服器崩潰恢復過程的一部分,並且是事務性的

3.3.1. 所有Undo日誌寫入也都會寫入Redo日誌

3.3.2. Redo日誌和Undo日誌的大小也是高併發事務工作機制中的重要影響因素

3.4. 僅適用於REPEATABLE READ和READ COMMITTED隔離級別

3.5. READ UNCOMMITTED與MVCC不相容

3.5.1. 查詢不會讀取適合其事務版本的行版本,而是不管怎樣都讀最新版本

3.6. SERIALIZABLE與MVCC也不相容

3.6.1. 讀取會鎖定它們返回的每一行

4. 複製

4.1. 一種原生方式來將一個節點執行的寫操作分發到其他節點

4.2. 對於在生產環境中運行的任何數據,都應該使用複製並至少有三個以上的副本

4.3. 理想情況下應該分佈在不同的地區(在雲托管環境中,稱為region)用於災難恢復計劃

5. 數據文件結構

5.1. 在8.0版本中

5.1.1. 將表的元數據重新設計為一種數據字典

5.1.1.1. 在表的.ibd文件中

5.1.1.2. 減少了I/O,非常高效

5.1.2. 刪除了基於文件的表元數據存儲

5.2. 引入了字典對象緩存

5.2.1. 基於最近最少使用(LRU)的記憶體緩存

5.2.1.1. 分區定義

5.2.1.2. 表定義

5.2.1.3. 存儲程式定義

5.2.1.4. 字元集

5.2.1.5. 排序信息

5.2.2. 當前訪問最活躍的那些表,在緩存中最常出現

5.2.2.1. 每個表的.ibd和.frm文件被替換為已經被序列化的字典信息(.sdi)

5.3. 原子DDL

5.3.1. MySQL 8.0引入了原子數據定義更改

5.3.2. 數據定義語句現在要麼全部成功完成,要麼全部失敗回滾

6. InnoDB引擎

6.1. MySQL主要的改進核心在於InnoDB的演進

6.1.1. 表元數據、用戶認證、身份鑒權這些內部統計信息的管理也已經調整為使用InnoDB表來實現

6.2. MySQL的預設事務型存儲引擎

6.2.1. 現在已經成為金標準,是推薦使用的引擎

6.2.2. 最重要、使用最廣泛的引擎

6.2.3. 為處理大量短期事務而設計的,這些事務通常是正常提交的,很少會被回滾

6.2.4. 幾乎能覆蓋每一種使用場景

6.3. 最佳實踐是使用InnoDB存儲引擎作為所有應用程式的預設引擎

6.4. 將數據存儲在一系列的數據文件中,這些文件統被稱為表空間(tablespace)

6.4.1. 表空間本質上是一個由InnoDB自己管理的黑盒

6.5. 使用MVCC來實現高併發性,並實現了所有4個SQL標準隔離級別

6.5.1. 預設為REPEATABLE READ隔離級別

6.5.2. 通過間隙鎖(next-key locking)策略來防止在這個隔離級別上的幻讀

6.5.2.1. 不只鎖定在查詢中涉及的行,還會對索引結構中的間隙進行鎖定,以防止幻行被插入

6.6. InnoDB表是基於聚簇索引構建的

6.6.1. 聚簇索引提供了非常快速的主鍵查找

6.7. 通過一些機制和工具支持真正的線上“熱”備份

6.7.1. Oracle專有的MySQL Enterprise Backup

6.7.2. 開源的Percona XtraBackup

6.8. 引入了SQL函數來支持在JSON文檔上的豐富操作


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

-Advertisement-
Play Games
更多相關文章
  • ## 前言: 在當今信息化社會,網路數據分析越來越受到重視。而作為開發人員,掌握一門能夠抓取網頁內容的語言顯得尤為重要。在此篇文章中,將分享如何使用 .NET構建網路抓取工具。詳細瞭解如何執行 HTTP 請求來下載要抓取的網頁,然後從其 DOM 樹中選擇 HTML 元素,進行匹配需要的欄位信息,從中 ...
  • ## 引言 深拷貝是指創建一個新對象,該對象的值與原始對象完全相同,但在記憶體中具有不同的地址。這意味著如果您對原始對象進行更改,則不會影響到複製的對象 常見的C#常見的深拷貝方式有以下4類: 1. 各種形式的序列化及反序列化。 2. 通過反射機制獲取該對象的所有欄位和屬性信息。遍歷所有欄位和屬性,遞 ...
  • 本文介紹如何使用Centos伺服器部署Docker和Docker Compose. ### 背景信息 本文中的命令使用的是**root用戶**登錄執行, 若不是root用戶要註意許可權問題. 筆者這裡使用的是阿裡雲伺服器, Linux版本為Centos 7.9, 使用SSH遠程連接到伺服器. ### ...
  • ## 固件升級方案綜述 單片機的固件升級方式有很多種, 1、ICP:In Circuit Programing,簡單說就是在單片機開發時使用燒錄器升級程式,比如使用J-Link燒錄單片機程式。 2、ISP:In System Programing,在單片機內部實現了基於通信介面(如串口、I2C、SP ...
  • 開始之前簡單講下源和包管理器的概念,個人理解如下: 源就是平時我們win電腦上的360軟體管家、騰訊軟體管家、微軟商店這個意思,提供下載各類軟體包、安裝包的平臺; 包管理器就是win電腦上各類軟體的安裝包,例如qq.exe、360.msi等,需要下載後用指定的命令可以進行安裝、協助等操作,跟源配合使 ...
  • ## [Ooonly] 前情提要:需要刷寫一整個app程式,分包刷寫,每包位元組數為單數,要求CRC校驗正確。(晶元底層提供32位全字刷寫和16位半字刷寫,驅動只整合了32位全字刷寫函數) 使用32位刷寫函數出現的現象:通過keil5觀察記憶體空間發現一包刷寫成功一包刷寫失敗一包刷寫成功...一直迴圈到 ...
  • 提要:本系列文章主要參考`MIT 6.828課程`以及兩本書籍`《深入理解Linux內核》` `《深入Linux內核架構》`對Linux內核內容進行總結。 記憶體管理的實現覆蓋了多個領域: 1. 記憶體中的物理記憶體頁的管理 2. 分配大塊記憶體的伙伴系統 3. 分配較小記憶體的slab、slub、slob分 ...
  • 本文將詳細介紹如何發佈.NET Core項目到IIS伺服器。首先,第一步需要安裝IIS,介紹了在本地電腦和伺服器中進行安裝。然後需要安裝SDK和運行時才能發佈.NETCore項目。其次介紹瞭如何發佈.NETCore項目和Vue項目,並配置IIS。最後介紹瞭如何將項目部署到Service服務中。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...