MySQL Server架構概述

来源:https://www.cnblogs.com/phpphp/p/18060496
-Advertisement-
Play Games

推薦:SQL語句執行順序相關問題。 MySQL Server架構 分層概述 MySQL Server架構可抽象為3層。 連接層:驗證用戶名密碼,認證成功後,獲取當前賬號的許可權並緩存,並分配TCP連接池和線程池資源。 處理層:實現核心的處理功能。 存儲層:將處理後的數據高性能安全的寫入磁碟,或從磁碟中 ...


推薦:SQL語句執行順序相關問題

MySQL Server架構

分層概述

MySQL Server架構可抽象為3層。

  1. 連接層:驗證用戶名密碼,認證成功後,獲取當前賬號的許可權並緩存,並分配TCP連接池和線程池資源。
  2. 處理層:實現核心的處理功能。
  3. 存儲層:將處理後的數據高性能安全的寫入磁碟,或從磁碟中正確的讀取。

模塊構成與執行順序

  1. 連接層 :提供多個線程用於客戶端和伺服器交互,連接層包含連接池與線程池。
    • 連接池:MySQL可以有多個客戶端進行連接,為瞭解決TCP連接頻繁創建銷毀引起的性能損耗,所以建立了TCP連接池,採用長連接模式復用TCP連接。
    • 線程池:MySQL採用多線程的方式運行,MySQL Server也會分配一個線程來處理後面的流程,像TCP連接池一樣,為了避免開銷,也會創建一個線程池。
  2. SQL介面:接收SQL指令,返回查詢結果。
  3. 緩存緩衝區:使用鍵值對的方式緩存查詢的結果(由於命中率太低在8的版本中被廢棄)。
  4. 解析器:對SQL語法進行分析,讓程式讀懂SQL。將SQL語句分解,驗證許可權,創建為語法樹,如果SQL語法錯誤,也是在這一步給的提示。流程如下:詞法分析->語法分析->分析機->抽象語法樹。
  5. 優化器:對SQL的執行進行優化,進行查詢時,根據索引和SQL的情況,選擇最合適的查詢策略,這個模塊是最複雜的模塊。
  6. 可插拔存儲引擎: 存儲引擎(InnoDB,MyISAM等)用於規範數據如何被高效安全的讀寫。可插拔主要體現在針對庫或者表可以進行引擎切換,結合日誌模塊 (老生常談的Bin、Relay、Redo、Undo、Error、General、Slow這些)生成相關日誌。
  7. 文件系統:這是操作系統層的東西,數據不是無腦存儲到磁碟上的,需要文件系統的約束,它提供了對存儲設備的訪問、分配、保護和檢索文件的方法,文件系統諸如NTFS,EXFAT,FAT32,NFS、NAS,EXT2、EXT3。

data文件相關

InnoDB引擎.frm、.idb、.opt文件是什麼?

MySQL登錄成功後使用SHOW VARIABLES LIKE 'datadir';,或者Linux系統下查看vim /etc/my.cnf,找datadir項,可查看數據存儲的目錄。認準一個使用InnoDB引擎的非空資料庫,在datadir/資料庫名的目錄下會發現有.frm、.idb文件、.opt類型的文件。

  1. .frm 存儲表結構的數據。
  2. .idb用於存儲數據(5.7及以上預設使用,8的版本只有.idb,把idb和.frm進行了合併)。
  3. .opt,通常叫做db.opt,純文本,用於存儲字元集編碼排序規則那套東西:例如default-character-set=utf8mb4;default-collation=utf8mb4_unicode_ci;(8的版本已去除)

InnoDB引擎.idb與ibdata1文件版本差異

註意mysql5.5.7到5.6.6的版本中的數據,是放在data/ibdata1文件中的。
.idb叫做獨立表空間,ibdata1叫做系統表空間。
使用show variables like 'innodb_file_per_table';可查看相關配置,如果是OFF,則表示使用ibdata1文件。ON表示使用獨立表空間。

MyISAM引擎.frm、.MYD、.MYI、.opt文件是什麼的?

MySQL登錄成功後使用SHOW VARIABLES LIKE 'datadir';,或者Linux系統下查看vim /etc/my.cnf,找datadir項,可查看數據存儲的目錄。認準一個使用InnoDB引擎的非空資料庫,在datadir/資料庫名的目錄下會發現有.frm、.MYD、.MYI、.opt文件類型的文件。

  1. .frm 存儲表結構的數據(在8的版本變成了.sdi)。
  2. .MYD,用於存數據。
  3. .MYI,用於存儲索引。
  4. .MYD、.MYI合併到一起,相當於InnoDB引擎的idb文件。
  5. .opt,通常叫做db.opt,純文本,用於存儲字元集編碼排序規則那套東西:例如default-character-set=utf8mb4;default-collation=utf8mb4_unicode_ci;(8的版本已去除)。

data下的各種日誌,會在另一篇文章中講。

既然有了information_schema 庫來存儲元數據,為什麼還要.frm和.opt?

information_schema庫,用於存儲資料庫的結構、表、視圖、列、約束、索引等信息的元數據,同時.frm和.opt也存儲了一份元數據,這也是問題的由來。

側重定位不同,information_schema 資料庫是一個用於快速檢索元數據的庫,方便開發者進行元數據分析和操作,而.frm是專門服務於表結構的,MySQL本身玩的就是數據,適當的冗餘不見得是壞事。

information_schema的部分數據基於.frm、.opt,還是獨立維護?

部分基於.frm、.opt。
試試就知道,開了一個虛擬機找一個測試庫,.frm非文本文件沒法改,修改某個庫的.opt文件,將default-collation=utf8mb4_unicode_ci;改為default-collation=utf8mb4_general_ci;重啟MySQL服務,執行SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'db_name';發現編碼同步做了更改。

擴展

MySQL8對緩存緩衝區的移除

緩存緩衝區和Redis在項目中作用與用法相似,用於緩存查詢語句查詢出來的結果,key為SQL語句,val為數據,使用空間換時間,裡面涉及表緩存,記錄緩存,許可權緩存等。
此模塊在8的版本中移除,因為命中率太低。如果查詢請求包含某些系統函數(now()),或者一些系統庫(如mysql、information_schema、performance_schema)那麼請求就不會被緩存。是緩存就會有一致性的問題,mysql會監聽每一張表的寫操作(DDL,DML),如果發生了變更,將會刪除緩存。其次是對於複雜的業務,不會只有讀操作,這也是分表冷熱數據分離的原因之一,所以被移除掉了。

客戶端連接器

連接器屬於客戶端(MySQL Client、Navicat、PHP的PDO,Java的JDBC等)的組件,所以放到了這裡。用於和MySQL Server通信。一般是有TCP和Socket兩種通信方式(與PHP與Nginx通信方式類似)。

  1. TCP就是常見的IP埠號的方式。
  2. Socket就是UNIX套接字,一種本地通信方式。在linux中創建一個套接字文件(.sock文件),客戶端通過該文件與伺服器通信。與TCP/IP相比,使用UNIX域套接字可以更快地進行本地通信,因為不需要經過網路協議棧的處理。但是因為無法遠程的局限性,所以用得少,對PHP開發者來說,PDO和主流框架,都支持此連接方式。

查詢緩存命中率

執行show status like 'Qcache%';會得到一個kv格式的表格
Qcache_free_blocks: 查詢緩存中空閑的記憶體塊數量。
Qcache_free_memory: 查詢緩存中可用的記憶體大小。
Qcache_hits: 查詢緩存命中的次數,即從查詢緩存中成功獲取到結果的查詢次數。
Qcache_inserts: 查詢緩存中插入的查詢次數。
Qcache_lowmem_prunes: 由於記憶體不足而從查詢緩存中移除的查詢次數。
Qcache_not_cached: 由於不符合查詢緩存規則而沒有被緩存的查詢次數。
Qcache_queries_in_cache: 當前查詢緩存中緩存的查詢數量。
Qcache_total_blocks: 查詢緩存中的記憶體塊總數量。

資料庫緩衝池

InnoDB是依靠頁來管理存儲空間的,CRUD的操作是對頁面的讀寫。因為磁碟IO操作慢,記憶體操作快,所以MySQL Server會使用記憶體來作為數據緩衝池,真正訪問頁之前,需要把磁碟上的頁緩存到記憶體中的Buffer Pool後才可以訪問,用於提升MySQL的性能。
流程:當資料庫系統需要從磁碟讀取數據時,它首先檢查緩衝池中是否已經緩存了相應的數據頁。如果數據頁已經在緩衝池中,則不需要從磁碟讀取,而是直接從緩衝池中獲取數據,這樣可以大大提高數據檢索速度。
緩衝池的數據有數據頁、索引頁、鎖數據、和數據字典。

配置緩衝池

MyISAM:緩衝池和innodb的不一樣,是鍵緩存,參數為key_buffer_size;
查看:SHOW VARIABLES LIKE 'key_buffer_size'; SHOW STATUS LIKE 'Key_blocks_%';單位為位元組。
配置:在my.cnf中配置key_buffer_size = 256M後重啟。
InnoDB:
查看:SHOW VARIABLES LIKE 'innodb_buffer_pool_size';單位為位元組。
配置:在my.cnf中配置innodb_buffer_pool_size = 256M後重啟。

不想要重啟,可以使用set globak k=v,(5.7及以上可用)。但是無法持久化保存。

多個緩衝池

在多線程情況下,訪問buffer pool中的數據需要加鎖處理,對於併發量打的情況下,加鎖會影響處理速度,所以就考慮到拆分buffer pool的情況,用於提高併發處理的能力。每個buffer pool被稱為一個實例,他們是獨立的,獨立的申請記憶體,獨立的管理數據。
查看:SHOW VARIABLES LIKE 'innodb_buffer_pool_instances';
配置:在my.cnf中配置innodb_buffer_pool_instances= 2後重啟。
每個buffer_size為innodb_buffer_pool_size / innodb_buffer_pool_instances;
當innodb_buffer_pool_size<=1GB時,設置多個實例是無效的。

執行SQL時更新了緩衝池的數據,這些數據會實時同步到磁碟嗎?

不會。
對數據表中的記錄進行修改時,首先會修改緩衝池中的數據,然後會以一定的頻率刷新到磁碟上,也不是每次更新操作都會把數據刷新到磁碟。緩衝池會採用一個叫做checkpoint的方式將更改的數據(臟頁數據)寫入到磁碟,此操作用於提升資料庫的性能。

InnoDB與MyISAM區別

項目 InnoDB MyISAM
事務 支持 不支持
外鍵 支持(但不支持跨引擎) 不支持
最小鎖粒度 行鎖 表鎖
日誌 支持redo、undo、bin log 支持bin log
聚簇索引 支持 不支持
二級索引葉子節點存儲 索引值與主鍵 索引值與所在行地址
適用場景 高併發,事務,金融 節省資源,輕量級簡單業務
count(*)統計演算法 逐行遍歷,時間複雜度O(n) 內部自動維護,時間複雜度O(1)

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

-Advertisement-
Play Games
更多相關文章
  • 本文說明的是MySQL鎖,和操作系統或者編程語言的鎖無關。 概念 作用:在併發情況下讓數據正確的讀寫。 優點:併發情況下對數據讀寫可控,防止出錯。 缺點:降低性能、增加難度。 分類 數據操作類型劃分 讀鎖(共用鎖、S鎖) 寫鎖(排它鎖、獨占鎖、X鎖) 粒度劃分 表級鎖 S鎖、X鎖 意向鎖 自增鎖 元 ...
  • 聲明測試表,供文章案例使用 CREATE TABLE `cs` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `num` int(10) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoD ...
  • Slow Log 簡介 用於記錄執行時間超過指定值的 SQL 語句的詳細信息,多用於調試和監控。 配置 因為開啟會略微影響性能,所以預設沒有開啟,所以需要配置。 查看是否開啟 show variables like '%slow%'; + + + | Variable_name | Value | ...
  • 註:以下所有內容均為自己總結的筆記,涉及底層原理,難度對標18K-25K薪資,偏理論,不保證百分百準確性。 索引查找快速的原理? 創建索引的本質是排序,排好序之後再找數據就快了。 對於B+tree索引,B+tree對數據排序後採用多路查找思想的非線性查找方案,減少了大量的查詢次數,從而避免多次磁碟i ...
  • 本文分享自華為雲社區《守護更多女性健康,華為雲GeminiDB助力美柚完成資料庫高效穩定遷移》,作者:華為雲頭條。 陽春三月,“三八”國際婦女節悄然而至。在社會快速發展的今天,女性力量在各個領域大放異彩,儘管女性成長路上可能會風雨兼顧,但是關註自己、保持身心健康才能走得更遠、看到更美的風景。美柚作為 ...
  • SQLQueryStress是SQL Server資料庫的一個壓測工具,這裡不打算介紹這款工具,而是淺析一下SQLQueryStress工具的一些指標涵義。如有疏漏或不足之處,敬請指正。 如下截圖所示,你會看到下麵一些指標 那麼對應指標的具體含義是啥呢?下麵表格整理了這些指標的含義; 很多同學對於C ...
  • 本期課程將從管理平臺的架構出發,結合平臺的實例管理、實例升級、容災管理和監控告警的功能和操作介紹,全面覆蓋日常運維操作,帶您理解並熟練運用GaussDB運維平臺完成運維工作。 ...
  • 索引相關 類型隱式轉換 大坑 **欄位filed1是varchar類型,且加了索引,如果 where filed1 = 123; type 可能是all,因為123是數字類型,mysql內部會用函數做隱式轉換,用了函數,索引就失效了。** 大數據深度分頁,用主鍵 select field1,fiel ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...