淺談MySQL的總體架構

前言

又是新的一週,各位週一好。緩存

因爲換工做,找房子這一系列事情都推在了一塊兒,因此最近停更了一個多月。如今全部的事情都已塵埃落定,我也能夠安安靜靜的碼字啦。安全

好了,也很少說,開始新的征程啦。最近一直在看《MySQL技術內幕——InnoDB存儲引擎》這本書,也正好記錄下吧。bash

總體架構圖

咱們先看一下MySQL的架構圖,對其先有一個總體的瞭解。MySQL主要分爲四層架構,分別是網絡鏈接層,服務層,存儲引擎層,物理層。咱們日常寫的SQL語句,以及對SQL語句的優化都在服務層,他其實就是遵循必定的原則使得SQL語句可以按咱們的預期效果執行。服務器


各部分介紹

網絡鏈接層

主要負責鏈接管理,受權認證,安全等。每一個客戶端鏈接都對應着服務器上的一個線程。服務器上維護一個線程池,避免爲每一個鏈接建立和銷燬線程。當客戶端鏈接到MySQL服務器時,服務器對其進行認證。能夠經過用戶名與密碼認證,也能夠經過SSL證書進行認證。登陸認證後,服務器還會驗證客戶端是否有執行某個查詢的操做權限。這一層並非MySQL所特有的技術。網絡

服務層

該層是MySQL的核心,包括查詢緩存,解析器,解析樹,預處理器,查詢優化器。架構


  • 查詢緩存
在正式查詢以前,服務器會檢查查詢緩存,若是能找到對應的查詢,則沒必要進行查詢解析,優化,執行等過程,直接返回緩存中的結果集。
  • 解析器和預處理器
MySQL的解析器會根據查詢語句,構造出一個解析樹,主要用於根據語法規則來驗證語句是否正確,好比SQL的關鍵字是否正確,關鍵字的順序是否正確。

而預處理器主要是進一步校驗,好比表名,字段名是否正確等。優化

  • 查詢優化器
查詢優化器將解析樹轉化爲查詢計劃,通常狀況下,一條查詢能夠有不少種執行方式,最終返回相同的結果,優化器就是找到這其中最優的執行計劃
  • 執行計劃
在完成解析和優化階段後,MySQL根據相應的執行計劃去調用存儲引擎層提供的相應接口來獲取結果。

存儲引擎層

負責MySQL數據的存儲和提取,是經過提供一系列的接口來屏蔽不一樣引擎之間的差別。ui

注意:存儲引擎是針對表的,而不是針對庫。也就是說同一個庫裏面的不一樣表能夠擁有不一樣的存儲引擎。spa

常見的存儲引擎有兩種,MyISAM和InnoDB,下面咱們來看下他們的區別。線程

首先,咱們先建立一個存儲引擎爲MyISAM的test1表。

create table test1(
a INTEGER,
b varchar(10)
)ENGINE=MyISAM;複製代碼

咱們能夠去MySQL的相關目錄看一下他實際存儲的內容,發現他對應着三個文件。


其次,咱們再建立一個存儲引擎爲InnoDB的test2表。

create table test2(
a INTEGER,
b varchar(10)
)ENGINE=INNODB;複製代碼

咱們再去看一下他實際存儲的內容,發現他對應這一個文件。


那麼問題就來了,他的數據文件和索引文件存放在哪裏啦。這邊先留個問題,下下篇"文件"再說。

物理層

將數據存放在硬盤上。

總體流程

咱們發送一條SQL語句,其在MySQL中的總體流程到底是什麼樣的?

  • 用戶先經過Navicat等客戶端與服務端創建鏈接,這邊須要用戶名和密碼進行認證,也能夠用SSL證書進行認證。
  • 登陸成功後,MySQL會根據相應權限來判斷該角色是否擁有一些表的權限等。
  • 若是擁有相關權限,當用戶發送一條查詢select語句時,MySQL先查詢緩存,若是已經有這條語句的緩存,則直接返回,若是沒有則執行下面的流程。若是是更新update,新增insert,刪除delete則不查詢緩存,直接執行下面的流程。
  • MySQL會將SQL語句解析爲樹,而後對其進行校驗,好比關鍵字是否正確,關鍵字順序是否正確,表名是否正確,字段是否正確等。若是認證沒有成功,則直接返回錯誤。若是認證成功了,則直接下面流程。
  • MySQL對解析樹進行查詢優化,由於多個SQL可能表達的意思同樣,可是消耗的時間可能差異很大。因此MySQL對針對錶的存儲引擎找到最優的語句執行,也就是生成相應的執行計劃。
  • 使用上面生成的執行計劃,來調用存儲引擎層的接口。也就是咱們平時使用的explain,其能夠用來查看是否走索引,消耗的時間等信息。
  • 不一樣的存儲引擎會到相應的物理存儲位置,找到相應的數據,封裝並返回結果。
  • 若是拿到告終果集,而且爲select語句,MySQL會將結果放入到緩存中,避免下次再進行相同的操做而形成資源的消耗,同時返回給客戶端結果,至此,一條SQL語句的執行過程結束啦。
相關文章
相關標籤/搜索