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

MySql中sql語(yǔ)句執(zhí)行過(guò)程詳細(xì)講解

 更新時(shí)間:2023年02月21日 09:33:36   作者:喜歡豬豬  
天天和數(shù)據(jù)庫(kù)打交道,一天能寫上幾十條 SQL 語(yǔ)句,但你知道我們的系統(tǒng)是如何和數(shù)據(jù)庫(kù)交互的嗎?下面這篇文章主要給大家介紹了關(guān)于MySql中sql語(yǔ)句執(zhí)行過(guò)程詳細(xì)講解的相關(guān)資料,需要的朋友可以參考下

前言:

很多人都在使用mysql數(shù)據(jù)庫(kù),但是很少有人能夠說(shuō)出來(lái)整個(gè)sql語(yǔ)句的執(zhí)行過(guò)程是怎樣的,如果不了解執(zhí)行過(guò)程的話,就很難進(jìn)行sql語(yǔ)句的優(yōu)化處理,也很難設(shè)計(jì)出來(lái)優(yōu)良的數(shù)據(jù)庫(kù)表結(jié)構(gòu)。這篇文章主要是講解一下sql語(yǔ)句的執(zhí)行過(guò)程。

sql語(yǔ)句的執(zhí)行過(guò)程:

客戶端、連接器、分析器、優(yōu)化器、執(zhí)行器、存儲(chǔ)引擎幾個(gè)階段。

連接器的作用:管理鏈接、權(quán)限驗(yàn)證的處理。

分析器的作用:詞法分析、語(yǔ)法分析。

優(yōu)化器的作用:執(zhí)行計(jì)劃的生成、索引選擇。

執(zhí)行器的作用:操作引擎、返回結(jié)果。

存儲(chǔ)引擎的作用:存儲(chǔ)數(shù)據(jù)、提供讀寫接口。

另外的一個(gè)分支是,會(huì)進(jìn)行查詢緩存的操作,如果命中了緩存則直接返回的操作。

mysql可以分為server層和存儲(chǔ)引擎層兩個(gè)部分:

server層:

包括鏈接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器等,涵蓋Mysql的大多數(shù)核心服務(wù)功能,以及所有的內(nèi)置函數(shù)(日期、時(shí)間、數(shù)學(xué)、和加密函數(shù)等),所有的存儲(chǔ)引擎的功能都在這一部分實(shí)現(xiàn)的,比如說(shuō)存儲(chǔ)過(guò)程、觸發(fā)器、視圖。

存儲(chǔ)引擎:

主要負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和提取,其架構(gòu)模式是插件式的,支持InnoDB、Memory等多個(gè)存儲(chǔ)引擎。最常用的是InnoDB,這個(gè)主要在Mysql5.5版本開(kāi)始成為了默認(rèn)存儲(chǔ)引擎。

當(dāng)在執(zhí)行sql查詢的時(shí)候,如果不指定引擎類型、默認(rèn)使用的innoDB。當(dāng)然也可以指定存儲(chǔ)引擎類型進(jìn)行處理,比如說(shuō)創(chuàng)建表的時(shí)候,可以把存儲(chǔ)引擎修改為memory,進(jìn)行表的創(chuàng)建出合理。當(dāng)然了,不同的存儲(chǔ)引擎的表數(shù)據(jù)存儲(chǔ)方式也是不一樣的。

連接器:

執(zhí)行sql語(yǔ)句的時(shí)候,第一步需要進(jìn)行數(shù)據(jù)庫(kù)的連接處理,連接器負(fù)責(zé)客戶端建立連接、獲取權(quán)限、維持和管理連接。

根據(jù)命令可以看出來(lái),主要進(jìn)行幾個(gè)參數(shù)的輸入,IP地址、端口號(hào)、以及用戶名、密碼的處理。連接mysql是客戶端工具,用戶服務(wù)器建立連接,進(jìn)行tcp握手之后,連接器需要進(jìn)行身份的驗(yàn)證,然后輸入用戶名、密碼。

密碼不對(duì)的時(shí)候,會(huì)收到一個(gè)“Access denied for user”的錯(cuò)誤提示,然后客戶端結(jié)束執(zhí)行。

用戶名、密碼驗(yàn)證通過(guò)之后,連接器就會(huì)開(kāi)始進(jìn)行權(quán)限表查詢權(quán)限,然后進(jìn)行權(quán)限的操作處理。

連接完成之后,沒(méi)有進(jìn)行其他的操作,這個(gè)時(shí)候連接就處于空閑狀態(tài),show processlist。

客戶端如果長(zhǎng)時(shí)間不操作的話,默認(rèn)的等待時(shí)間(wait_timeout)是八個(gè)小時(shí)。

數(shù)據(jù)庫(kù)建立連接是比較復(fù)雜的,建議在項(xiàng)目中盡量少的建立連接的操作,也就是說(shuō)盡量使用長(zhǎng)連接的處理。

在項(xiàng)目中經(jīng)常會(huì)遇到一種情況就是數(shù)據(jù)庫(kù)的長(zhǎng)連接,很長(zhǎng)時(shí)間不關(guān)閉的操作,這個(gè)時(shí)候會(huì)導(dǎo)致內(nèi)存的占用太大,被系統(tǒng)殺掉導(dǎo)致的Mysql的異常。

解決方案有下面兩種方案:

  • 定期斷開(kāi)長(zhǎng)連接,使用一段時(shí)間之后,比如說(shuō)執(zhí)行一個(gè)占用內(nèi)存的大查詢之后,這個(gè)時(shí)候斷開(kāi)連接,之后要查詢的話再重新連接。
  • 通過(guò)使用命令進(jìn)行重新初始化連接資源,這個(gè)時(shí)候需要重連,但是會(huì)把連接恢復(fù)到初始化的狀態(tài)。

查詢緩存:

連接建立完畢之后,進(jìn)行查詢緩存的處理,執(zhí)行sql語(yǔ)句會(huì)先到緩存中看看是不是剛剛執(zhí)行了這條語(yǔ)句,之前執(zhí)行過(guò)的語(yǔ)句及其結(jié)果就會(huì)以key-value對(duì)的形式直接存儲(chǔ)在內(nèi)存中的,key是查詢的語(yǔ)句,value是查詢的結(jié)果,如果查詢能夠直接在這個(gè)緩存中找到key,那么這個(gè)value可以直接返回給客戶端。

如果語(yǔ)句不在查詢緩存中的話,就會(huì)繼續(xù)后面的執(zhí)行階段,執(zhí)行完成后,執(zhí)行結(jié)果會(huì)被存入查詢緩存中。如果可以查詢到緩存的話,就不會(huì)進(jìn)行后面的復(fù)雜操作了,效率會(huì)高很多。

查詢緩存的弊端:

查詢緩存失敗一般情況下會(huì)比較頻繁,只要對(duì)一個(gè)表的進(jìn)行了更新的話,這個(gè)表上面所有的緩存就會(huì)被清空。因此一般情況下查詢緩存的命中率很低。一般情況下,一個(gè)系統(tǒng)的配置表或者靜態(tài)的表才會(huì)使用到查詢緩存的方式進(jìn)行處理。

分析器:

分析器首先會(huì)進(jìn)行詞法分析,輸入的是由多個(gè)字符串和空格組成的一條sql語(yǔ)句,mysql需要識(shí)別出來(lái)里面的字符串分別是什么,代表什么意思。

首先:mysql從輸入的select這個(gè)關(guān)鍵詞識(shí)別出來(lái),這個(gè)是一個(gè)查詢的語(yǔ)句,需要把from關(guān)鍵字后面的,字符串t識(shí)別出來(lái)表名稱等等的操作。

然后進(jìn)行語(yǔ)法分析的處理,根據(jù)詞法分析,根據(jù)詞法分析的結(jié)果,語(yǔ)句分析器就會(huì)根據(jù)語(yǔ)法規(guī)則判斷輸入的這個(gè)sql語(yǔ)句是否滿足mysql的語(yǔ)法。

檢查出來(lái)錯(cuò)誤提示如下圖:

一般提示錯(cuò)誤的信息只會(huì)進(jìn)行第一個(gè)錯(cuò)誤的位置。

優(yōu)化器:

經(jīng)過(guò)了分析器的處理,mysql就知道了該如何進(jìn)行優(yōu)化器的處理了,優(yōu)化器的處理邏輯是在表里面進(jìn)行多個(gè)索引的時(shí)候,決定使用那個(gè)索引,或者說(shuō)在一個(gè)語(yǔ)句有多個(gè)關(guān)聯(lián)的時(shí)候,決定各個(gè)表的連接順序的情況,如下圖所示:

第一種執(zhí)行的結(jié)果是處理t1.c=10是否走索引,然后可以先判斷 一下邏輯的結(jié)果是否一樣,如果執(zhí)行的結(jié)果是一樣的話,可以任意選擇一種方案進(jìn)行處理。

執(zhí)行器:

  • 調(diào)用InNoDB引擎接口取這個(gè)表的第一行,判斷值是否10,如果是10進(jìn)行集中處理,否則的話就跳過(guò)。
  • 執(zhí)行器將遍歷過(guò)程中所有滿足條件的行組成的記錄集合返回給客戶端。

總結(jié)

到此這篇關(guān)于MySql中sql語(yǔ)句執(zhí)行過(guò)程詳細(xì)講解的文章就介紹到這了,更多相關(guān)MySql sql語(yǔ)句執(zhí)行過(guò)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL中查詢JSON字段的實(shí)現(xiàn)示例

    MySQL中查詢JSON字段的實(shí)現(xiàn)示例

    MySQL自5.7版本起,對(duì)JSON數(shù)據(jù)類型提供了全面的支持,本文主要介紹了MySQL中查詢JSON字段的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • ubuntu kylin 14.10下多個(gè)mysql 5.7.14安裝教程

    ubuntu kylin 14.10下多個(gè)mysql 5.7.14安裝教程

    這篇文章主要為大家分享了ubuntu kylin 14.10下多個(gè)mysql 5.7.14安裝教程,感興趣的朋友可以參考一下
    2016-08-08
  • MySQL拋出Incorrect string value異常分析

    MySQL拋出Incorrect string value異常分析

    從上至下統(tǒng)一用上UTF-8就高枕無(wú)憂,今天還是遇到字符的異常,本文將介紹解決方法
    2012-11-11
  • 生產(chǎn)庫(kù)自動(dòng)化MySQL5.6安裝部署詳細(xì)教程

    生產(chǎn)庫(kù)自動(dòng)化MySQL5.6安裝部署詳細(xì)教程

    自動(dòng)化運(yùn)維是一個(gè)DBA應(yīng)該掌握的技術(shù),其中,自動(dòng)化安裝數(shù)據(jù)庫(kù)是一項(xiàng)基本的技能,這篇文章主要介紹了生產(chǎn)庫(kù)自動(dòng)化MySQL5.6安裝部署詳細(xì)教程,需要的朋友可以參考下
    2016-09-09
  • MYSQL修改所有表的存儲(chǔ)引擎格式語(yǔ)句

    MYSQL修改所有表的存儲(chǔ)引擎格式語(yǔ)句

    MYSQL如何修改所有表的存儲(chǔ)引擎格式,或許下面的sql語(yǔ)句對(duì)大家有所幫助
    2013-08-08
  • DDL數(shù)據(jù)庫(kù)與表的創(chuàng)建和管理深入講解使用教程

    DDL數(shù)據(jù)庫(kù)與表的創(chuàng)建和管理深入講解使用教程

    這篇文章主要介紹了DDL數(shù)據(jù)庫(kù)與表的創(chuàng)建和管理,系統(tǒng)架構(gòu)的層面來(lái)看,數(shù)據(jù)庫(kù)從大到小依次是數(shù)據(jù)庫(kù)服務(wù)器(上面安裝了DBMS和數(shù)據(jù)庫(kù))、數(shù)據(jù)庫(kù)(也稱database或者schema)、數(shù)據(jù)表、數(shù)據(jù)表的行與列
    2023-04-04
  • mysql字符串格式化方式

    mysql字符串格式化方式

    這篇文章主要介紹了mysql字符串格式化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 快速了解MySQL 索引

    快速了解MySQL 索引

    這篇文章主要介紹了MySQL 索引的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Mysql 5.7.17 winx64在win7上的安裝教程

    Mysql 5.7.17 winx64在win7上的安裝教程

    本文給大家介紹Mysql 5.7.17 winx64在win7上的安裝教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-04-04
  • MySQL5.7.31 64位免安裝版使用教程圖解

    MySQL5.7.31 64位免安裝版使用教程圖解

    這篇文章主要介紹了MySQL5.7.31 64位免安裝版使用教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10

最新評(píng)論