MySQL存儲引擎與架構

MySQL存儲引擎與架構

1.1詳細了解數據庫類型

1.1.1關系型數據庫

常見產品:MySQL(免費)、Oracle
關系型數據庫模型是把復雜的數據結構歸結為簡單二維表格形式。通常該表第一行為字段名稱,描述該字段的作用,下面是具體的數據。在定義該表時需要指定字段的名稱及類型。
在關系型數據庫中,對數據的操作幾乎全部建立在一個或多個關系表格上。在大型系統中通常有多個表,且表之間有各種關系。實際使用就是通過對這些關聯的表格分類、合并、連接或選取等運算來實現數據庫的管理

1.1.2非關系型數據庫

常見產品:Redis、MongoDB
鍵值數據庫是一種非關系數據庫,它使用簡單的鍵值方法來存儲數據。鍵值數據庫將數據存儲為鍵值對集合,其中鍵作為唯一標識符

1.1.3列存儲數據庫

常見產品:HBase
對于行存儲數據庫,表中的數據是以行為單位逐行存儲在磁盤上的;而對于列存儲數據庫,表中的數據則是以列為單位逐列存儲在磁盤中。
平時的查詢大部分都是條件查詢,通常是返回某些字段(列)的數據。對于行存儲數據,數據讀取時通常將一行數據完全讀出,如果只需要其中幾列數據的情況,就會存在冗余列,出于縮短處理時間的考量,消除冗余列的過程通常是在內存中進行的。而列存儲,每次讀取的數據是集合的一段或者全部,不存在冗余性問題。這樣,通過這種存儲方式的調整,使得查詢性能得到極大的提升。

1.1.4搜索引擎存儲

常見產品:ElasticSearch
搜索引擎數據庫是應用在搜索引擎領域的數據存儲形式,由于搜索引擎會爬取大量的數據,并以特定的格式進行存儲,這樣在檢索的時候才能保證性能最優
原理:用ik分詞器將文檔分為詞條,對詞條創建索引,記錄詞條所在id,查詢時先根據詞條查詢文檔id,再根據文檔id查詢文檔

1.2圖解MySQL 內部架構及作用

Mysql架構主要分為連接層、server層和存儲引擎層,每一層 中都含有各自的很多小模塊,尤其是第二層,結構相當復雜的。下面我們就分別 針對 這三層做一個簡單的分析。我們看下圖體系結構:
在這里插入圖片描述

1.2.1.Connectors

指的是不同語言中與SQL的交互,如php、java等。
1.2.2 系統管理和控制工具
系統管理和控制工具、內置工具和服務,專為數據庫的全生命周期管理設計,涵蓋 運維監控、數據維護、性能優化、安全管控 四大核心場景,旨在降低人工運維成本,提升系統穩定性與效率。

1.2.3 連接層

  • 在連接建立時,MySQL通常會優先加載全局權限和數據庫級權限,因為這些權限最常用。
  • 對于更細粒度的權限(如表級、列級權限),只有在執行具體的SQL操作時才會被加載。
  • 用來客戶端連接器請求過來以后,Connection Handler驗證賬戶和密碼,不正確,立馬返回Access denied for user,此外還會驗證ip,若都驗證通過,則連接成功,緩存全局權限和數據庫級權限。
  • 連接過程其實就是一個TCP連接的過程,此連接是一個長連接,注意,MySQL服務器與客戶端之間的通信是“半雙工”的,意味著任意時刻,要么是服務器向客戶端發送數據,要什么是客戶端向服務器發送數據(請求),不能同時進行。MySQL也不會讓你啥也不干一直連著,所以就有了超時時間,由wait_timeout控制(斷開是服務器端斷開,客戶端再請求過來就報Lost
    connection to MySQL server during query)
  • 連接器采用池化技術,節省了創建和銷毀的成本;
  • 默認只能連接151個客戶端,一個客戶端請求服務端分配一個線程(從線程里取),把線程池占滿了,再連就報連接滿了;
  • 客戶端一般也采用池化技術,優化請求,防止每次執行SQL都需要建立連接,減少開銷;
  • 長連接帶來一個問題,有些SQL在執行的過程中創建臨時表占用內存,連接不釋放,內存不回收,會導致MySQL占用內存漲的特別快,可以通過以下方式解決:
    • 定期斷開長連接(需要重連和權限驗證)
    • Druid會定期檢測空閑連接,默認的timeBetweenEvictionRunsMillis是60秒,minEvictableIdleTimeMillis是30分鐘,所以默認情況下,空閑超過30分鐘的連接會被釋放。

1.2.4 SQL接口

接受用戶的SQL命令,并且返回用戶需要查詢的結果。

1.2.5解析器

  • MySQL在真正執行語句之前,會去parser你的查詢語言,了解你要做什么
  • 在這個過程會判斷你的語法是否正確,不正確會報錯:You have an error in your SQL syntax;
  • 將查詢字段,表,條件封裝到內部的數據結構上形成解析樹

在這里插入圖片描述

1.2.6.查詢緩存

MySQL 8 將這塊刪除了,因為很雞肋:

  • 緩存匹配條件嚴格:需 SQL 完全一致(包括空格、注釋),解析后即可確定是否匹配。
  • 任何對表的寫操作(INSERT/UPDATE/DELETE)會標記該表關聯的所有緩存為無效。
  • MySQL接收到請求后,會先看緩存中有沒有(之前查詢的結果會以k-v的方式存儲在內存里,k是語句,v是結果)
  • 一般情況下查詢緩存的命中率是非常低的(除非你的數據是靜態的)
  • 可以通過在select 后加 SQL_CACHE 來顯示指定使用查詢緩存

1.2.7 Optimizer: 查詢優化器。

  • 通過語法解析,MySQL知道你的真實意圖了,但你寫的SQL不一定是高效的
  • 這個時候MySQL會給我們的SQL做些優化調整(基于成本去優化),比如:使用哪個索引,外連接轉換為內連接,多表連接的時候,表的連接順序從而確定最終的執行計劃
  • 例如:等價變換策略:比如 x<y and x=5 優化為y>5 and x=5
    聯合索引的位置調整:比如a,c,b聯合索引,b=3and a=5調整為a=5andb=3
    函數查詢優化:比如:min 直接從索引的左側開始查,max從右;

1.2.8.執行

  • 執行器
    • 解析完了,也優化完了,那就該執行了
    • 別急,還沒完,你有權限嗎?沒有,直接拒絕執行,有才可以執行
    • 執行器操作的是下一層的存儲引擎

1.2.9 存儲引擎接口

  • MySQL將操作封裝成了接口,屏蔽了不同存儲引擎的差異,各種存儲引擎實現了這些操作接口,內部又差異化的做了各種擴展;
  • 比如InnoDB鎖的粒度到行級,InnoDB的事務,都是差異性的
  • 我們可以通過show engines來查看支持的存儲引擎
  • 存儲引擎同一個實例只能啟用一種

1.2.10文件系統層

  • 文件系統由各操作系統提供
  • MySQL將其持久化的數據物理存儲在磁盤上,持久化保存數據、索引、binlog、redolog、undolog、error日志、慢sql等;

1.3說明一條SQL請求的過程

1.3.1 連接

SQL客戶端與與服務器建立連接,該請求被發送到連接器,連接器鑒權,

1.3.2 語法解析

首先通過mysql關鍵字將語句解析,會生成一個內部解析樹,mysql解析器將對其解析,查看是否是有錯誤的關鍵字,關鍵字順序是否正確等;

1.3.3 查詢緩存

如果查詢命中緩存(一個大小寫敏感的哈希查找實現的)則直接返回結果,如果查詢沒有命中緩存,則進行下一步sql解析。

1.3.4 生成執行計劃

mysql是基于成本的優化器,他將預測執行此計劃的成本,并選擇成本最小的那條

1.3.5 調用存儲引擎接口執行

在解析和優化階段,MySQL將生成查詢對應的執行計劃,由執行計劃調用存儲引擎的API來執行查詢MySQL就行,將結果返回給客戶端;即使查詢不需要返回結果,MySQL也會返回影響到的行數。

1.4了解主流存儲引擎特性及選擇策略

1.4.1 InnoDB 引擎(默認)

  1. 特性與優勢
    • 支持事務處理,具備 ACID 特性(原子性、一致性、隔離性、持久性),保證數據的完整性和可靠性。
    • 采用行級鎖,在高并發場景下能夠有效減少鎖沖突,提高并發處理能力。
    • 支持外鍵約束,便于維護表之間的關系,確保數據的一致性。
    • 具備良好的崩潰恢復能力,在數據庫發生故障時能夠快速恢復數據。
  2. 劣勢
    • 相對 MyISAM 引擎,其讀寫性能在一些簡單查詢場景下可能稍遜一籌。
    • 數據存儲和索引占用空間相對較大。
  3. 適用場景
    • 對事務完整性要求較高的應用,如電子商務系統、金融交易系統等。
    • 高并發讀寫的場景,例如在線事務處理(OLTP)系統。

1.4.2 MyISAM 引擎

  1. 特性與優勢
    • 讀取速度快,特別適合執行大量的 SELECT 查詢操作,其表結構簡單,數據存儲緊湊。
    • 不支持事務和行級鎖,但支持表級鎖,在對數據一致性要求不高的讀多寫少場景下性能較好。
    • 支持全文索引,可用于高效的文本搜索,如博客系統、新聞網站等。
  2. 劣勢
    • 不支持事務,無法保證數據的原子性和一致性,在數據更新頻繁的場景下可能導致數據問題。
    • 不支持外鍵約束,不利于表間關系的維護。
  3. 適用場景
    • 以讀為主的應用,如 Web 應用中的靜態數據查詢,如用戶信息查詢、文章內容查詢等。
    • 對全文搜索有需求的場景,如文檔管理系統、論壇等。

1.4.3 Memory 引擎

  1. 特性與優勢
    • 數據存儲在內存中,讀寫速度極快,適用于對讀寫性能要求極高的臨時數據存儲場景。
    • 支持哈希索引,能夠快速定位數據,提高查詢效率。
  2. 劣勢
    • 數據存儲在內存中,一旦服務器關閉或重啟,數據將丟失,因此不適合存儲重要的持久化數據。
    • 內存資源有限,對數據量有一定限制,不適合存儲大量數據。
  3. 適用場景
    • 用于存儲臨時數據或緩存數據,如會話數據、臨時計算結果等。
    • 對讀寫性能要求極高且數據量不大的場景,如一些實時統計系統中的中間計算結果存儲。

1.4.4 選擇策略

(一)根據應用需求選擇
  1. 如果應用需要處理大量的事務操作,確保數據的完整性和一致性至關重要,那么 InnoDB 引擎是首選。例如,銀行系統中的賬戶交易處理,必須保證每一筆交易的原子性和數據的持久可靠,InnoDB 的事務支持和崩潰恢復能力能夠滿足這一需求。
  2. 對于主要以讀取數據為主,對數據一致性要求不高,且數據更新較少的應用,如新聞網站的文章瀏覽功能,MyISAM 引擎可以提供快速的查詢性能,并且其全文索引功能可以方便用戶進行文章搜索。
  3. 在需要臨時存儲和快速處理數據的場景,如在一個大型電子商務網站的購物車功能中,存儲用戶購物車中的商品信息(在用戶未結算前),Memory 引擎能夠快速讀寫數據,提升用戶體驗,不過需要注意數據的備份和在合適時機將數據持久化到其他存儲引擎中。
(二)考慮數據量和硬件資源
  1. 如果數據量較大且硬件資源有限,InnoDB 引擎的高效存儲和良好的空間管理能力可能更適合。例如,一個大型企業的客戶關系管理系統,數據量隨著業務增長不斷增加,InnoDB 能夠在有限的硬件條件下較好地處理數據存儲和查詢。
  2. 對于內存資源充足且數據量較小的場景,Memory 引擎可以充分利用內存的高速讀寫特性。比如,在一個小型實時監控系統中,用于存儲最近幾分鐘的監控數據,Memory 引擎可以快速處理這些數據,及時提供監控結果。
(三)權衡性能與功能
  1. 如果對并發性能要求較高,InnoDB 的行級鎖可以有效減少鎖沖突,提高系統的并發處理能力。例如,在一個高并發的在線票務系統中,多個用戶同時查詢和預訂票務,InnoDB 能夠確保系統的高效運行。
  2. 若應用對全文搜索功能有強烈需求,MyISAM 的全文索引支持可以提供高效的文本搜索能力。如在一個內容豐富的知識管理系統中,用戶需要快速搜索文檔內容,MyISAM 引擎可以滿足這一功能需求。

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

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

相關文章

將浮點數轉換為分數

原理 double 由以下部分組成&#xff1a; 符號位指數部分尾數部分 符號位的含義&#xff1a;為 0 表示正數&#xff0c;為 1 表示負數。指數部分的含義&#xff1a;在規格化數中&#xff0c;指數部分的整型值減去 1023 就是實際的指數值。在非規格化數中&#xff0c;指數恒為…

前端實現截圖的幾種方法

前端實現截圖的幾種方法 前端實現截圖功能有多種方式&#xff0c;下面我將介紹幾種常用的方法及其實現方案。 1. 使用 html2canvas 庫 html2canvas 是最流行的前端截圖解決方案之一&#xff0c;它可以將 DOM 元素轉換為 canvas。 基本用法 import html2canvas from html2c…

TDengine 與開源可視化編程工具 Node-RED 集成

簡介 Node-RED 是由 IBM 開發的基于 Node.js 的開源可視化編程工具&#xff0c;通過圖形化界面組裝連接各種節點&#xff0c;實現物聯網設備、API 及在線服務的連接。同時支持多協議、跨平臺&#xff0c;社區活躍&#xff0c;適用于智能家居、工業自動化等場景的事件驅動應用開…

OpenCV——圖像形態學

圖像形態學 一、像素的距離二、像素的鄰域三、膨脹與腐蝕3.1、結構元素3.2、腐蝕3.3、膨脹 四、形態學操作4.1、開運算和閉運算4.2、頂帽和黑帽4.3、形態學梯度4.4、擊中擊不中 一、像素的距離 圖像中像素之間的距離有多種度量方式&#xff0c;其中常用的有歐式距離、棋盤距離…

在Django中把Base64字符串保存為ImageField

在數據model中使用ImageField來管理avatar。 class User(models.Model):AVATAR_COLORS ((#212736, Black),(#2161FD, Blue),(#36B37E, Green),(#F5121D, Red),(#FE802F, Orange),(#9254DE, Purple),(#EB2F96, Magenta),)def generate_filename(self, filename):url "av…

使用 R 處理圖像

在 R 中進行圖像處理&#xff0c;使用像 imager 這樣的包&#xff0c;可以實現強大的數字圖像分析和處理。本博客將基于"圖像數據分析"文檔的概念&#xff0c;演示使用 imager 包進行的關鍵技術——圖像增強、去噪和直方圖均衡化&#xff0c;并通過可視化結果展示這些…

一命速通Prometheus+Grafana+Consul+VictoriaMetrics

Prometheus業務 搭建及使用 注意&#xff1a;優先看完提供的博客鏈接&#xff0c;可以快速了解該工具的功能及其搭建和使用。 prometheusgrafana 一、PrometheusGrafana普羅米修斯&#xff0c;搭建和使用_普羅米修斯 grafana-CSDN博客 ./prometheus --config.fileprometheus.ym…

螞蟻百寶箱快速創建智能體AI小程序

螞蟻百寶箱官網https://tbox.alipay.com/community?operationSource1006/ 以下是一篇關于螞蟻百寶箱快速創建智能體 AI 小程序的圖文并茂的博客&#xff1a; 標題&#xff1a;螞蟻百寶箱快速創建智能體 AI 小程序&#xff0c;開啟智能應用新體驗 引言 在數字化飛速發展的當…

大模型面試題:RL Scaling Law 中的“過優化”現象及其緩解方法是啥?

更多面試題&#xff0c;請看 大模型面試題總結-CSDN博客 或者 https://gitee.com/lilitom/ai_interview_questions/blob/master/README.md 最好將URL復制到瀏覽器中打開&#xff0c;不然可能無法直接打開 ---------------------------------------------------------------…

Filecoin系列 - IPLD 技術分析

1. 用途 1.1 存儲數據 為了成功地將數據加到 Filecoin 網絡, 需要成功完成以下步驟: 客戶端導入數據生成CAR文件: 數據必須打包成 CAR file (內容可尋址檔案) - CAR是IPLD規范的序列化歸檔文件.存儲交易: 存儲供應商和客戶之間的存儲交易必須由客戶發起, 并由存儲供應商接受…

Apptrace如何幫我精準追蹤移動廣告效果?

開發者視角&#xff1a;Apptrace如何幫我精準追蹤移動廣告效果&#xff1f;?? 作為獨立開發者&#xff0c;我最頭疼的就是?“廣告投放到底有沒有用&#xff1f;”?——錢花出去了&#xff0c;用戶是刷量機器人還是真實用戶&#xff1f;哪個渠道的ROI最高&#xff1f;Apptr…

【MySQL篇07】:redo log日志與buffer pool詳解

文章目錄 1. Buffer Pool 緩沖池2. redo log (重做日志)redo log 的作用&#xff1a;為什么需要 redo log buffer&#xff1f;什么時候刷盤呢&#xff1f; 3. 總結一下 redo log 和 Buffer Pool 在更新數據時的協同工作關鍵組件關系圖刷盤完成后 1. Buffer Pool 緩沖池 首先&a…

Qt Library庫系列----Serial串口

前言 每次寫串口相關的功能時&#xff0c;總是需要重新寫或者復制原來寫過的文件&#xff0c;容易出錯不說&#xff0c;這也不是碼農的風格&#xff0c;所以還是得有一套自己得代碼庫&#xff0c;方便調用&#xff0c;又能保持神秘感。 一、開發需求 1.有個實例類&#xff1b;…

第八節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 用戶管理(下)

Vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 對接后端登錄接口(上) ? 第四節:Vben Ad…

Redis 性能瓶頸時如何處理?

當 Redis 遇到性能瓶頸時&#xff0c;需要從多個維度進行排查和優化。以下是系統化的解決方案&#xff0c;涵蓋硬件、配置、數據模型、網絡等關鍵點&#xff1a; 一、硬件資源優化 內存瓶頸 現象&#xff1a;頻繁觸發 OOM 或 used_memory 接近物理內存。解決&#xff1a; 升級服…

多相機三維人臉掃描儀:超寫實數字人模型制作“加速器”

超寫實數字人&#xff0c;又稱“數字分身”&#xff0c;是以真人形象為原型構建的高仿真虛擬形象&#xff0c;按維度可分為2D數字人與3D數字人。這類數字人已廣泛應用于影視制作、游戲交互、品牌直播等場景&#xff0c;其核心價值在于通過技術手段實現真人形象的數字化復刻&…

ceph 自動調整 pg_num

要讓 Ceph 的 pool 自動調整 pg_num(PG 數量),你需要啟用 PG autoscaler。這是從 Ceph Octopus(15.x) 開始引入的功能,能根據池的容量和對象數量自動建議或調整 pg_num,以實現負載均衡。 ? 一步步開啟 Pool 的 pg_num 自動調整 1. 啟用 PG autoscaler 模塊(通常默認啟…

Python Beautiful Soup 4【HTML/XML解析庫】 簡介

全面剖析大模型 圖解大模型&#xff1a;生成式AI原理與實戰 大語言模型大模型應用開發Transformer DeepSeek模型原理開發深度學習 圖靈出品 大模型強化學習詳解 大模型算法&#xff1a;強化學習、微調與對齊&#xff08;全彩&#xff09;詳解強化學習 RLHF GRPO DPO SFT CoT D…

AI Agent開發與安全

AI Agent的核心演進 Level 1&#xff1a;LLM Agent&#xff08;聊天機器人&#xff09; 特點&#xff1a;靠提示詞工程賦予人設&#xff08;如星座占卜、角色扮演&#xff09;&#xff0c;但存在幻覺問題&#xff0c;輸出不可控。局限&#xff1a;娛樂性強&#xff0c;難勝任嚴…

NumPy玩轉數據科學

本文在創作過程中借助 AI 工具輔助資料整理與內容優化。圖片來源網絡。 文章目錄 一、引言二、NumPy 概述2.1 NumPy 的定義與發展2.2 NumPy 的重要性 三、NumPy 的多維數組支持3.1 多維數組的概念3.2 多維數組的創建與操作3.2.1 數組的創建3.2.2 數組的索引和切片3.2.3 數組的運…