欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

論一條select語句在MySQL是怎樣執(zhí)行的

 更新時間:2021年08月25日 17:21:56   作者:咔咔-  
本文將建立一套建立一套MySQL的知識框架,通過討論select語句在MySQL是怎樣執(zhí)行的來展開內(nèi)容,感興趣的小伙伴一起來看下文吧

一、從宏觀的角度分析MySQL

首先看一張經(jīng)典圖片(MySQL邏輯架構(gòu)圖

上圖的客戶端可以直接理解為PHP、Java等。接下來,你會看到連接、線程處理。這一部分并不是MySQL所特有的,而且大多數(shù)客戶端、服務(wù)器都具有類似的結(jié)構(gòu)。

因此,一般而言,MySQL可以分為兩層:Server層和存儲引擎層。

Server層主要包括連接層、查詢緩存、分析器、優(yōu)化器、執(zhí)行器等重要模塊組成,這一層還包含了MySQL核心Api部分,比如常用的格式化時間、加密等。

存儲引擎大家都很熟悉,因為在面試中不止一次的問過大家Innodb、Myisam存儲引擎的不同。

所以想過沒有,MySQL為什么會有這么多的存儲引擎呢?

一切技術(shù)起源于當下問題,同樣在MySQL中也不例外。

MySQL在存儲引擎這一方面的架構(gòu)是插件式的,即可以隨意切換不固定,而且MySQL5.5版本存儲引擎已經(jīng)默認為Innodb。

二、一條SQL執(zhí)行要經(jīng)過多少困難?

MySQL詳細架構(gòu)圖

圖中還有一個熟悉的陌生人查詢緩存模塊,該模塊在MySQL8.0中已不存在。

首先,我們將大致了解當我們執(zhí)行一條SQL語句時,如何在這個架構(gòu)圖中運行。

2-1 連接器

mysql -u root -p連接數(shù)據(jù)庫命令,在執(zhí)行之后,你將需要輸入密碼。當完成經(jīng)典的TCP握手之后,連接器就開始發(fā)揮作用了。

如果碼錯誤時,則返回Access denied for user ‘root‘@‘localhost‘ (using password: YES,錯誤編碼1045。

如果連接信息均正確,則此時將根據(jù)你輸入的用戶訪問權(quán)限表來獲取該用戶的權(quán)限,此處必須清楚,當你登錄成功后,即使其他人修改了你的權(quán)限,在這個連接未斷開之前你的權(quán)限是不會發(fā)生改變的。

當你連接完成之后,如果你一直不做任何事情,執(zhí)行show processlist將會看到一個sleep,表示空連接。

那么你知道在MySQL中,如果連接成功后沒有進行任何操作,多久會被自動中斷?

可以執(zhí)行show variables like 'wait_timeout';用于查看時間。

在MySQL中如果沒有特別說明,那么所有的時間都是以秒為單位的,根據(jù)時間轉(zhuǎn)換可以得知空連接持續(xù)8小時。

2-2 查詢緩存

你需要注意的是,MySQL8.0已經(jīng)被取消了,這個問題不止說了一次了,特別是那些正在使用MySQL8.0以下版本的小伙伴要注意哈!當你切換到8.0時候,遇到這個問題不知道怎么解決。

MySQL8.0為何取消查詢緩存模塊

這個模塊的設(shè)計,把查詢語句作為key ,將結(jié)果作為value 進行緩存,一旦這個表有更新,之前所有的緩存都會被清除掉。這就像你辛辛苦苦寫的代碼提交之后被別人覆蓋一樣難受。

MySQL8.0以下的版本提供了一個參數(shù)query_cache_type = enmand來控制是否要使用查詢緩存,在設(shè)置完成后,默認的select語句將不會被緩存。

如果確實可以使用部分場景,那么你可以將sql_cache添加到select關(guān)鍵字之后。

如果一條select語句之前被緩存過,那么結(jié)果集在這里就會直接返回,而沒有緩存過的select語句就比較辛苦了,還要繼續(xù)自己的漫漫長路。

2-3 分析器

MySQL8.0之前,它會在進入分析器之前判斷是否緩存,在MySQL8.0之后,連接器驗證成功后就直接進入分析器。

分析器,根據(jù)字面意思來理解就是分析要執(zhí)行的SQL語句是什么,要做什么。

比如執(zhí)行select * from user where id = 1

MySQL首先根據(jù)select判斷這是一個查詢語句,然后將user識別為表名,id識別為字段名,這個過程被稱為詞法分析。

下一步,需要知道該SQL的語法是否正確,進行語法分析,如果語法不對你就會看到Y(jié)ou have an error in your SQL syntax錯誤。通常,將在use near中找到該錯誤。

2-4 優(yōu)化器

到了這一步,MySQL知道你要做什么,但是要選擇最佳執(zhí)行方案。

優(yōu)化器都優(yōu)化些什么?

舉例來說:多個索引時選擇那個索引、多表關(guān)聯(lián)時連接順序。

現(xiàn)在你是否想知道,優(yōu)化器將優(yōu)化多表關(guān)聯(lián)的連接順序,那在寫SQL語句時是否就不必考慮連接順序呢?

當然不是,能讓MySQL少做事情就少做,還是一個準則用小表驅(qū)動大表。

2-5 執(zhí)行器

通過要做什么、怎么做后這條SQL語句才會真正的被執(zhí)行,先進行權(quán)限驗證,若沒有權(quán)限則直接返回權(quán)限錯誤,否則根據(jù)表定義的存儲引擎,去使用對應(yīng)引擎提供的接口。

執(zhí)行流程圖

上圖包含了正文的所有知識點,也是整個MySQL的大體執(zhí)行流程圖。

到此這篇關(guān)于論一條select語句在MySQL是怎樣執(zhí)行的的文章就介紹到這了,更多相關(guān)select執(zhí)行MySQL語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一次Mysql死鎖排查過程的全紀錄

    一次Mysql死鎖排查過程的全紀錄

    在測試環(huán)境測試給用戶并發(fā)發(fā)送卡券時,出現(xiàn)了死鎖,通過查找相關(guān)的資料解決了這個,所以想著總結(jié)出來,所以下面這篇文章主要是關(guān)于一次Mysql死鎖排查過程的全紀錄,需要的朋友可以參考下,希望大家從中能有所幫助。
    2017-02-02
  • MySQL分區(qū)建索引以及分區(qū)介紹總結(jié)

    MySQL分區(qū)建索引以及分區(qū)介紹總結(jié)

    當mysql一張數(shù)據(jù)表中的數(shù)據(jù)達到一定的量時,在其中查詢某一個數(shù)據(jù),需要花費大量的時間,下面這篇文章主要給大家介紹了關(guān)于MySQL分區(qū)建索引以及分區(qū)介紹的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • 一文帶你了解MySQL之連接原理

    一文帶你了解MySQL之連接原理

    搞數(shù)據(jù)庫一個避不開的概念就是Join,翻譯成中?就是連接,相信很多小伙伴初學(xué)連接的時候有些一臉懵,理解了連接的語義之后又可能不明白各個表中的記錄到底是怎么連起來的,所以本章就來學(xué)習連接的原理,需要的朋友可以參考下
    2023-05-05
  • Mysql、Oracle中常用的多表修改語句總結(jié)

    Mysql、Oracle中常用的多表修改語句總結(jié)

    這篇文章主要給大家介紹了關(guān)于Mysql、Oracle中常用的多表修改語句的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-12-12
  • MySQL子查詢的使用詳解下篇

    MySQL子查詢的使用詳解下篇

    子查詢是在查詢語句里面再嵌套一個查詢,這是因為我們在提取數(shù)據(jù)的時候有很多不知道的數(shù)據(jù)產(chǎn)生了依賴關(guān)系。本文為大家總結(jié)了一下MySQL數(shù)據(jù)庫子查詢語法規(guī)則,感興趣的可以了解一下
    2022-08-08
  • MySQL自動安裝批處理腳本實例代碼

    MySQL自動安裝批處理腳本實例代碼

    為了日后安裝數(shù)據(jù)庫方便,下面這篇文章主要給大家介紹了關(guān)于MySQL自動安裝批處理腳本的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • mysql實現(xiàn)本地keyvalue數(shù)據(jù)庫緩存示例

    mysql實現(xiàn)本地keyvalue數(shù)據(jù)庫緩存示例

    這篇文章主要介紹了代碼實現(xiàn)本地Key-Value緩存示例,大家參考使用吧
    2013-12-12
  • MySQL的一條慢SQL查詢導(dǎo)致整個網(wǎng)站宕機的解決方法

    MySQL的一條慢SQL查詢導(dǎo)致整個網(wǎng)站宕機的解決方法

    通常來說,我們看到的慢查詢一般還不致于導(dǎo)致掛站,頂多就是應(yīng)用響應(yīng)變慢不過這個恰好今天被我撞見了,一個慢查詢把整個網(wǎng)站搞掛了
    2016-07-07
  • MySQL 8.0 新特性之檢查約束的實現(xiàn)

    MySQL 8.0 新特性之檢查約束的實現(xiàn)

    這篇文章主要介紹了MySQL 8.0 新特性之檢查約束的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-12-12
  • mysql獲取版本的幾種方法實現(xiàn)

    mysql獲取版本的幾種方法實現(xiàn)

    本文主要介紹了mysql獲取版本的方法實現(xiàn),主要介紹了三種方法,包含SELECT VERSION(),SHOW VARIABLES和命令行,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06

最新評論