1. 程式人生 > >深入理解Mysql 工作原理

深入理解Mysql 工作原理

剛開始接觸一個新的事物的時候,我覺得很有必要從其工作原理入手,弄清楚這個東西的來龍去脈,為接下來的繼續深入學習做好鋪墊,掌握好其原理有助於我們從整體上來把握這個東西,並且幫助我們在排錯過程中理清思路。接下來,還是從mysql的工作原理開始入手,下面先來一張經典的圖:

   上面的圖就是mysql的內部架構,可以清楚的看到Mysql是由SQL介面,解析器,優化器,快取,儲存引擎組成的。

-+-----------------------------------------------------------------------------------+-

   下面是關於上述部件的介紹:

1. connectors

   與其他程式語言中的sql 語句進行互動,如php、java等。

2. Management Serveices & Utilities

   系統管理和控制工具

3. Connection Pool (連線池)

管理緩衝使用者連線,執行緒處理等需要快取的需求

4. SQL Interface (SQL介面)

接受使用者的SQL命令,並且返回使用者需要查詢的結果。比如select from就是呼叫SQL Interface

5. Parser (解析器)

SQL命令傳遞到解析器的時候會被解析器驗證和解析。

主要功能:

a . 將SQL語句分解成資料結構,並將這個結構傳遞到後續步驟,後面SQL語句的傳遞和處理就是基於這個結構的

b.  如果在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的,語句將不會繼續執行下去

6. Optimizer (查詢優化器)

SQL語句在查詢之前會使用查詢優化器對查詢進行優化(產生多種執行計劃,最終資料庫會選擇最優化的方案去執行,儘快返會結果) 他使用的是“選取-投影-聯接”策略進行查詢。

用一個例子就可以理解: select uid,name from user where gender = 1;

這個select 查詢先根據where 語句進行選取,而不是先將表全部查詢出來以後再進行gender過濾

這個select查詢先根據uid和name進行屬性投影,而不是將屬性全部取出以後再進行過濾

將這兩個查詢條件聯接起來生成最終查詢結果.

7. Cache和Buffer (查詢快取)

如果查詢快取有命中的查詢結果,查詢語句就可以直接去查詢快取中取資料。

這個快取機制是由一系列小快取組成的。比如表快取,記錄快取,key快取,許可權快取等

8.Engine (儲存引擎)

儲存引擎是MySql中具體的與檔案打交道的子系統。也是Mysql最具有特色的一個地方。

Mysql的儲存引擎是外掛式的。它根據MySql AB公司提供的檔案訪問層的一個抽象介面來定製一種檔案訪問機制(這種訪問機制就叫儲存引擎)

-+-----------------------------------------------------------------------------------+-

SQL 語句執行過程

   資料庫通常不會被直接使用,而是由其他程式語言通過SQL語句呼叫mysql,由mysql處理並返回執行結果。那麼Mysql接受到SQL語句後,又是如何處理的呢?

   首先程式的請求會通過mysql的connectors與其進行互動,請求到處後,會暫時存放在連線池(connection pool)中並由處理器(Management Serveices & Utilities)管理。當該請求從等待佇列進入到處理佇列,管理器會將該請求丟給SQL介面(SQL Interface)。SQL介面接收到請求後,它會將請求進行hash處理並與快取中的結果進行對比,如果完全匹配則通過快取直接返回處理結果;否則,需要完整的走一趟流程:

   (1)由SQL介面丟給後面的直譯器(Parser),上面已經說到,直譯器會判斷SQL語句正確與否,若正確則將其轉化為資料結構。

   (2)直譯器處理完,便來到後面的優化器(Optimizer),它會產生多種執行計劃,最終資料庫會選擇最優化的方案去執行,儘快返會結果。

   (3)確定最優執行計劃後,SQL語句此時便可以交由儲存引擎(Engine)處理,儲存引擎將會到後端的儲存裝置中取得相應的資料,並原路返回給程式。

這裡有幾點需要注意:

(1)如何快取查詢資料?

儲存引擎處理完資料,並將其返回給程式的同時,它還會將一份資料保留在快取中,以便更快速的處理下一次相同的請求。具體情況是,mysql會將查詢的語句、執行結果等進行hash,並保留在cache中,等待下次查詢。

(2)buffer與cache的區別?

從上面的圖可以看到,快取那裡實際上有buffer和cache兩個,那它們之間是否有什麼不同呢?簡單的說就是,buffer是寫快取,cache是讀快取。

(3)如何判斷快取中是否已快取需要的資料

這裡可能有一個誤區,覺得處理SQL語句的時候,為了判斷是否已快取查詢結果,會將整個流程走一遍,取得執行結果後再與需要的進行對比,看看是否命中,並以此說,既然不管快取中有沒有快取到查詢內容,都要整個流程走一遍,那麼快取的優勢又在哪裡??

實際上,並非如此,在第一次查詢後,mysql便將查詢語句以及查詢結果進行hash處理並保留在快取中,SQL查詢到達之後,對其進行同樣的hash處理後,將兩個hash值進行對照,如果一樣,則命中,從快取中返回查詢結果;否則,需要整個流程走一遍。

相關推薦

深入理解Mysql 工作原理

剛開始接觸一個新的事物的時候,我覺得很有必要從其工作原理入手,弄清楚這個東西的來龍去脈,為接下來的繼續深入學習做好鋪墊,掌握好其原理有助於我們從整體上來把握這個東西,並且幫助我們在排錯過程中理清思路。接下來,還是從mysql的工作原理開始入手,下面先來一張經典的圖:

深入理解Mock工作原理

Mock的作用不同於Spy,Fake。Mock主要用於測被測體與外部的互動邏輯。一般是指在不同的場景下多次的與外部互動。當外部依賴是硬體,或者外部程式不ready的情況下,Mock就能幫助完成單元測試。 以下圖為例,FlashDriver與IO系統有多次的互動,互動函式是r

深入理解瀏覽器工作原理

前面的話   瀏覽器(browser application)是專門用來訪問和瀏覽全球資訊網頁面的客戶端軟體,也是現代計算機系統中應用最為廣泛的軟體之一,其重要性不言而喻。前端工程師作為負責程式頁面顯示的工程師,需要直接與瀏覽器打交道。本文將詳細介紹瀏覽器的工作原理 組成   瀏覽器的組成如下圖所示

深入理解MySQL索引原理和實現——為什麼索引可以加速查詢?

說到索引,很多人都知道“索引是一個排序的列表,在這個列表中儲存著索引的值和包含這個值的資料所在行的實體地址,在資料十分龐大的時候,索引可以大大加快查詢的速度,這是因為使用索引後可以不用掃描全表來定位某行的資料,而是先通過索引表找到該行資料對應的實體地址然後訪問相應的資料。”但

Mysql高手系列 - 第22篇:深入理解mysql索引原理,連載中

Mysql系列的目標是:通過這個系列從入門到全面掌握一個高階開發所需要的全部技能。 歡迎大家加我微信itsoku一起交流java、演算法、資料庫相關技術。 這是Mysql系列第22篇。 背景 使用mysql最多的就是查詢,我們迫切的希望mysql能查詢的更快一些,我們經常用到的查詢有: 按照id查詢唯一一條

轉載--LVS之原理篇--深入全面理解LVS工作原理

一、介紹     LVS是Linux Virtual Server的簡寫,即Linux虛擬伺服器,是一個虛擬的伺服器集群系統。該專案由章文嵩博士成立,是中國國內最早出現的自由軟體專案之一。     使用LVS技術要達到的目標是:通過LVS提供的負載均衡技術和Linux作業

從程序員的角度深入理解MySQL

mysql前言作為一名工作了4年的程序猿,今天我將站在程序員的角度以MySQL為例探索數據庫的奧秘!數據庫基本原理第一,數據庫的組成:存儲 + 實例不必多說,數據當然需要存儲;存儲了還不夠,顯然需要提供程序對存儲的操作進行封裝,對外提供增刪改查的API,即實例。一個存儲,可以對應多個實例,這將提高這個存儲的負

深入理解mysql索引

bit 大於 ... image mysql 行數據 查詢 數據檢索 強制 建立索引的優缺點: 為什麽要創建索引呢? 這是因為,創建索引可以大大提高系統的性能。 第一、通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。 第二、可

mysql工作原理和存儲引擎

img log 分享圖片 技術 alt 架構 http 架構圖 div 1.mysql工作原理和邏輯架構圖 2.mysql表類型和存儲引擎 mysql工作原理和存儲引擎

理解LVS工作原理

LVS一.基礎介紹 ????LVS是Linux虛擬服務(Linux Virtual Server)的簡稱,是一個虛擬的服務器集群系統,是國內最早的一批自由軟件項目,由章文嵩博士發起。現在LVS項目已經被Linux內核收錄,成為Linux表針內核的一個重要組成部分。??隨著互聯網大潮的不斷發展,縱向拓展的高額成

深入理解 Spring 事務原理

順序 etc wid efi 這一 tran source 所在 回滾 一、事務的基本原理 Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是無法提供事務功能的。對於純JDBC操作數據庫,想要用到事務,可以按照以下步驟進行: 獲取連接

深入理解MyBatis的原理(三):配置文件上

dynamic 如何 turn ready conf 屬性。 支持 left bool 前言:前文提到一個入門的demo,從這裏開始,會了解深入 MyBatis 的配置,本文講解 MyBatis 的配置文件的用法。 目錄 1、properties 元素 2、設置(set

深入理解MyBatis的原理(三):配置文件用法(續)

pac amt 單個 gis obb rri tab obj 用戶 前言:前文講解了 MyBatis 的配置文件一部分用法,本文將繼續講解 MyBatis 的配置文件的用法。 目錄 1、typeHandler 類型處理器 2、ObjectFactory 3、插件 4、e

自定義RPC的完整實現---深入理解rpc內部原理

channel struct seek raise services utf-8 proto encode res 倘若不使用RPC遠端調用的情況下,代碼如下: local.py # coding:utf-8 # 本地調用除法運算的形式 class InvalidOper

深入理解mysql的底層實現

MySQL 的常用引擎 1. InnoDB InnoDB 的儲存檔案有兩個,字尾名分別是 .frm 和 .idb,其中 .frm 是表的定義檔案,而 idb 是資料檔案。 InnoDB 中存在表鎖和行鎖,不過行鎖是在命中索引的情況下才會起作用。

深入理解JVM——基本原理

前言   JVM一直是java知識裡面進階階段的重要部分,如果希望在java領域研究的更深入,則JVM則是如論如何也避開不了的話題,本系列試圖通過簡潔易讀的方式,講解JVM必要的知識點。 執行流程   我們都知道java一直宣傳的口號是:一次編譯,到處執行。那麼它如何

深入理解mysql資料庫B+樹索引

索引的作用: 首先索引通俗來講就像書的目錄,通過索引可以快速查詢對應資料,但這僅僅是表面上的,索引主要作用有3點,這僅僅算作其中1點。以下是鄙人的理解: 通過索引可以減少資料的掃描量(例如上面提到的將全書掃描,變成了根據目錄找) 索引可以把對硬碟的隨機IO變為順序IO()

深入理解Mysql》之利用索引排序

使用Mysql的索引進行排序可以大大提高Mysql的效能,使用索引排序的原則是 按照建立索引的順序查詢和排序,執行如下sql create table t1( id int not null auto_increment, uname varchar(32) not null,

深入理解Spring事務原理

事務的基本原理 Spring事務的本質其實就是資料庫對事務的支援,沒有資料庫的事務支援,spring是無法提供事務功能的。 對於純JDBC操作資料庫,想要用到事務,可以按照以下步驟進行: 1、獲取連線 Connection con = DriverManager.getCo

從程式設計師的角度深入理解MySQL

前言 作為一名工作了4年的程式猿,今天我將站在程式設計師的角度以MySQL為例探索資料庫的奧祕!   資料庫基本原理 我對DB的理解 第一,資料庫的組成:儲存 + 例項 不必多說,資料當然需要儲存