主頁 > 軟體設計 > MySQL性能優化(一)MySQL中SQL陳述句是如何執行的?

MySQL性能優化(一)MySQL中SQL陳述句是如何執行的?

2021-12-07 11:08:24 軟體設計

該篇章將開始整理MySQL的優化,不過開始之前,我們想了解清楚那就是MySQL是怎么執行的,

文章目錄

  • 1.MySQL驅動
  • 2.應用系統資料庫連接池
  • 3.MySQL資料庫連接池
  • 4.SQL執行程序
    • 4.1.執行緒監聽:監聽網路請求中的SQL陳述句
    • 4.2.SQL介面:負責處理接收到的SQL陳述句
    • 4.3.查詢決議器:讓MySQL能看懂SQL陳述句
    • 4.4.查詢優化器:選擇最優的查詢路徑
    • 4.5.存盤引擎介面:真正執行SQL陳述句
    • 4.6.執行器:根據執行計劃呼叫存盤引擎的介面
  • 5.總結

1.MySQL驅動

大家都知道,我們如果要在Java系統中去訪問一個MySQL資料庫,必須得在系統的依賴中加入一個MySQL驅動,有了這個MySQL驅動才能跟MySQL資料庫建立連接,然后執行各種各樣的SQL陳述句,
MySQL驅動,他會在底層跟資料庫建立網路連接,有網路連接,接著才能去發送請求給資料庫服務器!當我們跟資料庫之間有了網路連接之后,我們的Java代碼才能基于這個連接去執行各種各樣的增刪改查SQL陳述句,
在這里插入圖片描述

2.應用系統資料庫連接池

假設我們的系統是部署在Tomcat中的,那么Tomcat本身肯定是有多個執行緒來并發的處理同時接收到的多個請求的,如果Tomcat中的多個執行緒并發處理多個請求的時候,都要去搶奪一個連接去訪問資料庫的話,那效率肯定是很低下的,
在這里插入圖片描述

如果Tomcat中的每個執行緒在每次訪問資料庫的時候,都基于MySQL驅動去創建一個資料庫連接,然后執行SQL陳述句,然后執行完之后再銷毀這個資料庫連接,可能Tomcat中上百個執行緒會并發的頻繁創建資料庫連接,執行SQL陳述句,然后頻繁的銷毀資料庫連接,也是非常不好的,因為每次建立一個資料庫連接都很耗時,好不容易建立好了連接,執行完了SQL陳述句,你還把資料庫連接給銷毀了,下一次再重新建立資料庫連接,那肯定是效率很低下的!
在這里插入圖片描述
所以一般我們必須要使用一個資料庫連接池,也就是說在一個池子里維持多個資料庫連接,讓多個執行緒使用里面的不同的資料庫連接去執行SQL陳述句,然后執行完SQL陳述句之后,不要銷毀這個資料庫連接,而是把連接放回池子里,后續還可以繼續使用,基于這樣的一個資料庫連接池的機制,就可以解決多個執行緒并發的使用多個資料庫連接去執行SQL陳述句的問題,而且還避免了資料庫連接使用完之后就銷毀的問題,
常見的資料庫連接池有DBCP,C3P0,Druid
在這里插入圖片描述

3.MySQL資料庫連接池

任何一個系統都會有一個資料庫連接池去訪問資料庫,也就是說這個系統會有多個資料庫連接,供多執行緒并發的使用,同時我們可能會有多個系統同時去訪問一個資料庫,這都是有可能的,MySQL也必然要維護與系統之間的多個連接,

實際上MySQL中的連接池就是維護了與系統之間的多個資料庫連接,除此之外,你的系統每次跟MySQL建立連接的時候,還會根據你傳遞過來的賬號和密碼,進行賬號密碼的驗證,庫表權限的驗證,
在這里插入圖片描述

4.SQL執行程序

4.1.執行緒監聽:監聽網路請求中的SQL陳述句

現在假設我們的資料庫服務器的連接池中的某個連接接收到了網路請求,假設就是一條SQL陳述句,那么大家先思考一個問題,誰負責從這個連接中去監聽網路請求?誰負責從網路連接里把請求資料讀取出來?
我想很多人恐怕都沒思考過這個問題,但是如果大家對計算機基礎知識有一個簡單了解的話,應該或多或少知道一點,那就是網路連接必須得分配給一個執行緒去進行處理,由一個執行緒來監聽請求以及讀取請求資料,比如從網路連接中讀取和決議出來一條我們的系統發送過去的SQL陳述句,如下圖所示
在這里插入圖片描述

4.2.SQL介面:負責處理接收到的SQL陳述句

當MySQL內部的作業執行緒從一個網路連接中讀取出來一個SQL陳述句之后,此時會如何來執行這個SQL語
句呢?
MySQL內部首先提供了一個組件,就是SQL介面(SQL Interface),他是一套執行SQL陳述句的介面,專門用于執行我們發送給MySQL的那些增刪改查的SQL陳述句,因此MySQL的作業執行緒接收到SQL陳述句之后,就會轉交給SQL介面去執行,如下圖:
在這里插入圖片描述

4.3.查詢決議器:讓MySQL能看懂SQL陳述句

SQL介面怎么執行SQL陳述句呢?你直接把SQL陳述句交給MySQL,他能看懂和理解這些SQL陳述句嗎?
比如我們來舉一個例子,現在我們有這么一個SQL陳述句:

select id,name,age from users where id=1

MySQL自己本身也是一個系統,是一個資料庫管理系統,他沒法直接理解這些SQL陳述句!
所以此時有一個關鍵的組件要出場了,那就是查詢決議器,

這個查詢決議器(Parser)就是負責對SQL陳述句進行決議的,比如對上面那個SQL陳述句進行一下拆解,拆解成以下幾個部分:

  1. 我們現在要從“users”表里查詢資料(from users)
  2. 查詢“id”欄位的值等于1的那行資料(where id=1)
  3. 對查出來的那行資料要提取里面的“id,name,age”三個欄位(select id,name,age)

所謂的SQL決議,就是按照既定的SQL語法,對我們按照SQL語法規則撰寫的SQL陳述句進行決議,然后理解這個SQL陳述句要干什么事情,如下圖所示
在這里插入圖片描述

4.4.查詢優化器:選擇最優的查詢路徑

當我們通過決議器理解了SQL陳述句要干什么之后,接著會找查詢優化器(Optimizer)來選擇一個最優的查詢路徑,
在語法分析階段:會對SQL陳述句進行分析,比如如下sql陳述句

select A.name, A.age from tb_student A where A.age=18 and A.name='張三'

該SQL在被執行之前,會先進行語法檢測,判斷有無錯誤,之后會分析出如下兩個sql查詢條件,

  1. where A.age=18
  2. where A.name=‘張三’

問題就來了,這兩個條件誰先執行有區別嗎?答案是肯定的,在我們撰寫SQL的時候,都會遵循一個原則,就是把區分度最高的放在左側,

  1. where A.name=‘張三’ AND A.age=18
  2. where A.age=18 AND A.name=‘張三’

上面這就是一個最簡單的SQL陳述句的兩種實作路徑,其實我們會發現,要完成這個SQL陳述句的目標,兩個路徑都可以做到,但是哪一種更好呢?顯然感覺上是第一種查詢路徑更好一些,因為在我們資料庫系統中,叫張三的人可能只有幾百個,但是年齡為18歲的,可能有幾萬個,

所以查詢優化器大概就是干這個的,他會針對你撰寫的幾十行、幾百行甚至上千行的復雜SQL陳述句生成查詢路徑樹,然后從里面選擇一條最優的查詢路徑出來,相當于他會告訴你,你應該按照一個什么樣的步驟和順序,去執行哪些操作,然后一步一步的把SQL陳述句就給完成了,
在這里插入圖片描述

4.5.存盤引擎介面:真正執行SQL陳述句

把查詢優化器選擇的最優查詢路徑,也就是你到底應該按照一個什么樣的順序和步驟去執行這個SQL陳述句的計劃,把這個計劃交給底層的存盤引擎去真正的執行,這個存盤引擎是MySQL的架構設計中很有特色的一個環節,

真正在執行SQL陳述句的時候,要不然是更新資料,要不然是查詢資料,那么資料你覺得存放在哪里?
以對資料庫而言,我們的資料要不然是放在記憶體里,要不然是放在磁盤檔案里,
在這里插入圖片描述
那么現在問題來了,我們已經知道一個SQL陳述句要如何執行了,但是我們現在怎么知道哪些資料在記憶體里?哪些資料在磁盤里?我們執行的時候是更新記憶體的資料?還是更新磁盤的資料?我們如果更新磁盤的資料,是先查詢哪個磁盤檔案,再更新哪個磁盤檔案?

所以這個時候就需要存盤引擎了,存盤引擎其實就是執行SQL陳述句的,他會按照一定的步驟去查詢記憶體快取資料,更新磁盤資料,查詢磁盤資料,等等,執行諸如此類的一系列的操作,如下圖所示,
在這里插入圖片描述
存盤引擎支持各種各樣的存盤引擎的,比如我們常見的InnoDB、MyISAM、Memory等等,我們是可以選擇使用哪種存盤引擎來負責具體的SQL陳述句執行的,當然現在MySQL一般都是使用InnoDB存盤引擎,

4.6.執行器:根據執行計劃呼叫存盤引擎的介面

存盤引擎可以幫助我們去訪問記憶體以及磁盤上的資料,那么是誰來呼叫存盤引擎的介面呢?
其實我們現在還漏了一個執行器的概念,這個執行器會根據優化器選擇的執行方案,去呼叫存盤引擎的介面按照一定的順序和步驟,就把SQL陳述句的邏輯給執行了,

執行器就會去根據我們的優化器生成的一套執行計劃,然后不停的呼叫存盤引擎的各種介面去完成SQL
陳述句的執行計劃,大致就是不停的更新或者提取一些資料出來,在這里插入圖片描述

5.總結

本文介紹內容總體如下流程圖所示
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/374842.html

標籤:其他

上一篇:《九國列車》(學習報告)《leecode零基礎指南》(第8天) ——貪心,對題目的處理及題解和錯題的總結

下一篇:Hadoop環境搭建筆記

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more