MySQL之架構簡單分析

来源:https://www.cnblogs.com/dx520/archive/2019/11/09/11826695.html
-Advertisement-
Play Games

上圖為MySQL的簡易架構圖,給您有一個大概的概念,下麵我將為您進行進一步的分析。 連接器: 當連接MySQL資料庫時,等待的將是MySQL服務端的連接器;連接器的職責是和客戶端建立連接、獲取許可權、維持和管理連接。客戶端連接命令一般是如下所示(建議:不要在命令中顯示添加登入密碼): mysql -h ...


 

 

上圖為MySQL的簡易架構圖,給您有一個大概的概念,下麵我將為您進行進一步的分析。

連接器:

當連接MySQL資料庫時,等待的將是MySQL服務端的連接器;連接器的職責是和客戶端建立連接、獲取許可權、維持和管理連接。客戶端連接命令一般是如下所示(建議:不要在命令中顯示添加登入密碼):

mysql -h$ip -p$port -u$user -p$password

查詢緩存:

建立完連接後,就可執行select語句。執行就會走向查詢緩存。

MySQL拿到這個查詢請求後,就會先到緩存中看看,之前是不是執行了該語句。在查詢緩存中數據是以key-value形式存在的,key為執行的查詢請求,value為查詢結果。如果執行了就直接從緩存中把結果返回給客戶端,請求結束。如果語句不在緩存中,就執行後續複雜操作。

在大多數情況下不建議使用查詢緩存,為什麼呢?因為查詢緩存往往弊大於利。

查詢緩存的失效非常頻繁,只要對錶進行了更新,該表的中查詢緩存全部清除。所以往往很多時候,緩存還沒使用就被清除了。對於更新壓力很大的資料庫來說,查詢緩存的命中率很低。如果你的業務中存在一張靜態表,很長時間才會更新一次。比如,系統配置表,那這張表的查詢才適合查詢緩存。

該功能是自動配置的。可以將參數 query_cache_type 設置成 DEMAND ,這樣對於預設的SQL語句就不會使用查詢緩存。而對於確定的查詢語句,可以使用 SQL_CACHE 顯示指定,比如如下語句:

select SQL_CACHE * from t where id = 1;

註意:在MySQL8.0之後的版本,把查詢緩存模塊移除了。

分析器

 在沒有命中查詢緩存後,MySQL開始真正執行語句了。這時MySQL對該語句進行解析。

分析器首先進行詞法分析,一條sql由多個字元串和空格組成,MySQL需要分析出這些字元串是什麼,代表什麼。

做完識別之後,進行語法分析。根據詞法分析的結果,語法分析器會根據語法規則對sql語句進行分析,是否符合MySQL的語法規則。

優化器

執行完分析器後,MySQL就知道該sql語句要乾什麼了。在開始執行之前,要經過優化器的處理。 

優化器在表裡存在多個索引時,選擇執行哪個索引;或者一個語句有多表關聯時(join),選擇各表的連接順序。

執行器

MySQL通過分析器知道了該語句要做什麼,通過優化器知道該怎麼做,於是進入到了執行器階段,開始執行語句。

開始執行之前,首先會判斷用戶是否有對錶的執行許可權(如果是在查詢緩存得到結果,會在返回結果之前進行許可權校驗),如果沒有會報錯.。如果有許可權,就打開表繼續執行語句。打開表的時候,執行器會根據表的引擎定義,去使用引擎提供的介面。

存儲引擎

MySQL區別於其他數據的最具有點的是存儲引擎介面模塊,MySQL可進行插拔存儲引擎。

MySQL的存儲引擎有很多種,比如:InnoDB、MyISAM、ISAM、Memory等。在MySQL5.6之前,預設存儲引擎是MyISAM,而在該版本之後預設的是InnoDB。下表是兩者之前的區別:

  InnoDB

MyISAM

存儲文件

.frm 表定義文件,.ibd 數據文件和索引文件

.frm 表定義文件,.myd 數據文件, .myi 索引文件
表鎖、行鎖 表鎖
事務 支持 不支持
CRUD 讀、寫 讀多
count 掃表 專門存儲的地方
索引結構 B+樹 B+樹

 

近期在學習MySQL資料庫, 後續將會持續更新學習隨筆。

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 解決無法定位軟體包 或 install net-tools 當我們安裝好Linux後,因為裡面有很多功能服務沒有安裝(如ifconfig、vsftpd) 所以出現一些command '***** ' not found,but can be installed with錯誤 我們就會需要安裝來使用, ...
  • 操作文件 創建文件 [root@localhost ~]# touch a.txt # 創建單個文件 [root@localhost ~]# touch b.txt c.txt # 創建多個文件 刪除文件 [root@localhost ~]# rm a.txt # 刪除單個文件 [root@loc ...
  • Mysql Join 連接查詢(中) 認識 就我平時的數據接觸來看, 連接查詢也沒有很複雜,不夠是非常需要耐心和邏輯的, 一點點將數據查出來, 拼接等. 沒有什麼技巧, 多練習就會了. 無非就是 表之間根據共同key來連接, 查詢時結合union, where, 子查詢這些... , 真的不難的, ...
  • 之前,在Codeproject發表過一篇關於用現有表中數據創建Insert的Sql語句的存儲過程,今天將其搬到這裡來,註意本存儲過程僅適用於SQL SERVER。 介紹 一些時候,你想導出一些現有表中記錄的Sql腳本以便你可以插入這些數據到另一個資料庫的相似表中。有很多方式可以做到,現在,我將跟大家 ...
  • create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(col varchar(20)) as begin while(charindex(@split,@c)<>0) begin insert @t( ...
  • 檢測是不是數字型的數據, 兩種方法 1. ISNUMERIC ( expression ) 2. PATINDEX ( ‘%pattern%‘ , expression ) 1. ISNUMERIC ( expression ) 如果是數字類型則返回 1 ,不是則返回 0 但ISNUMERIC有時是 ...
  • 在網上有關Redis相關文章滿天飛的時候,這個時候我決定重溫一下NoSQL。它是什麼,用於解決什麼問題,有哪些相類似的技術,與傳統的關係型資料庫有哪些差別,什麼時候使用?也正如書中所說的,篇幅短小,內容卻很豐富。新技術的誕生,我們應該以既穩健又前瞻的心態看待它。 1. 它是什麼,用於解決什麼問題? ...
  • select *,stuff(select ‘,’ + fieldname from table1 for xml path(”)),1,1,”) as field from table2 for xml path(”) ,自從 SQL Server2005及更高版本提供了一個新查詢語法 ,主要是用 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...