最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql架構(gòu)圖解讀

 更新時(shí)間:2024年08月13日 09:21:05   作者:it_lihongmin  
這篇文章主要介紹了Mysql架構(gòu)圖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Mysql服務(wù)端架構(gòu)分為Server層和存儲(chǔ)引擎層(可插拔式),Server層主要包含了連接器、緩存模塊、分析器、優(yōu)化器、執(zhí)行器;可插拔的存儲(chǔ)引擎主要有InnoDB、MyISAM、Memory。

當(dāng)一個(gè)請(qǐng)求進(jìn)入后的執(zhí)行流程如下圖的箭頭所示:

一、Server層

1、連接器

連接器主要負(fù)責(zé)與Mysql客戶端建立連接,權(quán)限認(rèn)證,維持和管理鏈接。

當(dāng)開(kāi)始連接服務(wù)器時(shí)需要使用賬號(hào)、密碼登錄服務(wù)器,執(zhí)行命令:

mysql -h $ip -P $port -u $root -p $password

如果用戶名驗(yàn)證不通過(guò)則會(huì)報(bào)錯(cuò):Access denied for user;成功則繼續(xù)調(diào)用權(quán)限表,獲取用戶權(quán)限信息,存儲(chǔ)到類(lèi)似本地線程變量中,后續(xù)分析器、優(yōu)化器中會(huì)使用。當(dāng)給當(dāng)前用戶權(quán)限進(jìn)行修改后,自己需要重新登錄才能獲取新的權(quán)限信息,類(lèi)似我們自己寫(xiě)權(quán)限相關(guān)代碼時(shí),會(huì)將權(quán)限、角色等相關(guān)信息存儲(chǔ)到線程本地變量 ThreadLocal 中。

當(dāng)與服務(wù)器建立鏈接后,我們可以使用 show processlist; 命令查看當(dāng)前鏈接到服務(wù)器的客戶端鏈接信息,如果status為sleep等狀態(tài)表示處于空閑狀態(tài)。記得自己剛開(kāi)始開(kāi)發(fā)項(xiàng)目時(shí),客戶端沒(méi)有配置好,服務(wù)器請(qǐng)求量很低,特別是晚上,第二天來(lái)就會(huì)看到報(bào)錯(cuò):Lost connection to MySQL server during query。就是在連接器模塊報(bào)錯(cuò)的,服務(wù)端配置 wait_timeout 可以設(shè)置客戶端再次請(qǐng)求時(shí),判斷是否超時(shí),為8小時(shí)。

與服務(wù)器端的鏈接分為長(zhǎng)鏈接和短連接。短連接本身每次都會(huì)執(zhí)行TCP的三次握手和四次揮手,并且建立鏈接后會(huì)進(jìn)行認(rèn)證和權(quán)限相關(guān)的操作,我們需要防止客戶端并發(fā)量遞增時(shí)對(duì)服務(wù)器端的短連接風(fēng)暴?,F(xiàn)在開(kāi)發(fā)項(xiàng)目Mysql客戶端基本都基于線程池實(shí)現(xiàn),線程本身是復(fù)用的長(zhǎng)鏈接,長(zhǎng)鏈接的弊端是會(huì)在服務(wù)端線程內(nèi)部存儲(chǔ)大量的查詢緩存等信息,只有斷開(kāi)鏈接時(shí)才會(huì)釋放。所以最好是使用長(zhǎng)鏈接的同時(shí),當(dāng)執(zhí)行了比較大的事務(wù)之后,手動(dòng)斷開(kāi)鏈接,釋放資源。在 5.7版本之后,mysql增加了mysql_reset_connection參數(shù)可以將鏈接初始化到剛剛創(chuàng)建鏈接時(shí)的狀態(tài),我們可以在長(zhǎng)事務(wù)或者定時(shí)執(zhí)行該操作。

2、緩存模塊

緩存模塊是一直比較弊病的模塊,在 Mysql 8之后已經(jīng)廢棄掉了。由于查詢時(shí)根據(jù)整個(gè)sql進(jìn)行hash計(jì)算,我們知道hash計(jì)算哪怕原字符有一個(gè)標(biāo)點(diǎn)不同那么hash值也完全不同,所以一定要sql一模一樣才能匹配緩存。

但是整個(gè)表只要有一點(diǎn)修改操作就會(huì)將所有緩存進(jìn)行刪除,即可能費(fèi)了很大的力氣進(jìn)行緩存,但是還沒(méi)執(zhí)行緩存查詢就被刪除了。

所以緩存只適用于配置表等基本不會(huì)變動(dòng)的數(shù)據(jù),但是個(gè)人理解,隨著redis等旁路緩存的普及,基于所有的項(xiàng)目都有緩存,那么數(shù)據(jù)庫(kù)的緩存弊病多使用。

  • query_cache_type 設(shè)置為 off/on 緩存是否開(kāi)啟;
  • query_cache_size = 0:緩存大小,可以設(shè)置如:128M;
  • 也可以將 query_cache_type 設(shè)置為 :DEMAND, 在需要緩存時(shí)顯示調(diào)用,如: select SQL_CAHCE * from table where id = 100;

3、分析器(分析需要做什么)

讀執(zhí)行的sql進(jìn)行詞法和語(yǔ)法分析,詞法分析需要解析如select是一個(gè)查詢語(yǔ)句,查詢的具體表名,查詢的條件等;語(yǔ)法分析如 sql字符串 是否符合sql規(guī)范,是否符合Mysql 自己的sql規(guī)范等。

一般遇到的

you have an error in your SQL syntax use near...

就是在該模塊報(bào)出的。

4、優(yōu)化器(分析怎么做)

優(yōu)化器主要負(fù)責(zé)索引的選擇、多表關(guān)聯(lián)時(shí)的 join 順序,這些都具體在后面專門(mén)進(jìn)行分析。

5、執(zhí)行器(執(zhí)行過(guò)程)

執(zhí)行器負(fù)責(zé)具體調(diào)用底層的存儲(chǔ)引擎接口,處理數(shù)據(jù)。

rows_examined調(diào)用底層引擎接口查詢的條數(shù)或次數(shù),有可能這里調(diào)用一次疊加一次,但是內(nèi)部可能查詢了多行數(shù)據(jù)。

二、存儲(chǔ)引擎層

常用的存儲(chǔ)引擎有InnoDB、MyISAM、Memory,現(xiàn)在很多公司的數(shù)據(jù)庫(kù)規(guī)范直接規(guī)定創(chuàng)建表只能使用 InnoDB,不僅僅是因?yàn)橹С质聞?wù),還與運(yùn)維時(shí)候的數(shù)據(jù)備份等相關(guān)。

在 Mysql 5.5后,將默認(rèn)的存儲(chǔ)引擎從 MyISAM變更為 InnoDB,只是個(gè)人還是比較喜歡或者建議在創(chuàng)建表時(shí),顯示設(shè)置存儲(chǔ)引擎 engine = Innodb。

Memory引擎作為臨時(shí)表的默認(rèn)存儲(chǔ)引擎,當(dāng)執(zhí)行復(fù)雜sql或數(shù)據(jù)量比較大需要使用臨時(shí)表;或者我們自己手動(dòng)基于臨時(shí)表實(shí)現(xiàn)業(yè)務(wù)時(shí),都會(huì)用到Memory存儲(chǔ)引擎,所以還是需要關(guān)注的。

存儲(chǔ)引擎需要關(guān)注具體的數(shù)據(jù)結(jié)構(gòu):

InnoDB只支持B+樹(shù)的數(shù)據(jù)結(jié)構(gòu),而Memory引擎支持B+樹(shù)和Hash索引。

B+樹(shù)支持快速的讀寫(xiě),并且時(shí)間復(fù)雜度為O(logN),支持區(qū)間查詢。

Hash索引讀寫(xiě)的時(shí)間復(fù)雜度近似O(1),比較適合內(nèi)存中使用,不支持區(qū)間查詢。

三、查詢流程

select name from table_1 where email = 'XXX'; // 比如該表使用 innoDB引擎
  • 1、【連接器】先使用長(zhǎng)鏈接或者短鏈接,使用用戶名和密碼進(jìn)行登錄操作;
  • 2、【連接器】執(zhí)行上面的select語(yǔ)句,到連接器;
  • 3、【緩存模塊】判斷是否有開(kāi)啟緩存,或者要查詢緩存,有查詢完成后需要回執(zhí)緩存;
  • 4、【解析器】檢查sql的詞法、語(yǔ)法分析,是否sql有問(wèn)題;
  • 5、【優(yōu)化器】判斷是否有索引,是否需要進(jìn)行優(yōu)化等(這里沒(méi)有join等操作);

email無(wú)索引

  • 6、【執(zhí)行器】、調(diào)用innoDB引擎接口獲取表的第一條數(shù)據(jù),判斷 eamil是否相等,如果是則放入結(jié)果集中,疊加器rows_examined++
  • 7、【執(zhí)行器】、重復(fù)執(zhí)行上面的動(dòng)作,一直到表的最后一行
  • 8、【執(zhí)行器】、將結(jié)果集返回給客戶端

email有索引:(之前一直以為是innoDB直接返回了所有滿足條件的結(jié)果集給執(zhí)行器)

  • 6、【執(zhí)行器】、調(diào)用InnoDB的滿足條件的第一行數(shù)據(jù),內(nèi)部查詢走索引
  • 7、【執(zhí)行器】、獲取滿足條件的下一行
  • 8、【執(zhí)行器】、返回結(jié)果集

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • MySQL普通索引與唯一索引的使用與區(qū)別

    MySQL普通索引與唯一索引的使用與區(qū)別

    本文主要介紹了MySQL普通索引與唯一索引的使用與區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Mysql分組排序取每組第一條的2種實(shí)現(xiàn)方式

    Mysql分組排序取每組第一條的2種實(shí)現(xiàn)方式

    開(kāi)發(fā)中經(jīng)常會(huì)遇到,分組查詢最新數(shù)據(jù)的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Mysql分組排序取每組第一條的2種實(shí)現(xiàn)方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • 詳解如何在MySQL中自動(dòng)生成和更新時(shí)間戳

    詳解如何在MySQL中自動(dòng)生成和更新時(shí)間戳

    在數(shù)據(jù)庫(kù)設(shè)計(jì)中,時(shí)間戳字段(如 create_time 和 update_time)是非常常見(jiàn)的需求,它們通常用于記錄數(shù)據(jù)的創(chuàng)建時(shí)間和最后更新時(shí)間,以便于數(shù)據(jù)追蹤和分析,本文將深入探討如何在 MySQL 中設(shè)置自動(dòng)生成和更新時(shí)間戳字段,需要的朋友可以參考下
    2025-02-02
  • MySQL?5.5,?5.6,?5.7,?8.0?特性對(duì)比

    MySQL?5.5,?5.6,?5.7,?8.0?特性對(duì)比

    MySQL是一個(gè)廣泛使用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),你知道各個(gè)版本之前的區(qū)別嗎,本文主要介紹了MySQL?5.5,?5.6,?5.7,?8.0?特性對(duì)比,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • CentOS6.9+Mysql5.7.18源碼安裝詳細(xì)教程

    CentOS6.9+Mysql5.7.18源碼安裝詳細(xì)教程

    CentOS6.9+Mysql5.7.18源碼安裝,以下操作均在root用戶下執(zhí)行。下面通過(guò)本教程給大家詳細(xì)介紹CentOS6.9+Mysql5.7.18源碼安裝方法,需要的的朋友參考下吧
    2017-06-06
  • Mysql數(shù)據(jù)庫(kù)樂(lè)觀鎖與悲觀鎖示例詳解

    Mysql數(shù)據(jù)庫(kù)樂(lè)觀鎖與悲觀鎖示例詳解

    樂(lè)觀鎖和悲觀鎖是并發(fā)控制的一種機(jī)制,用于多線程或多進(jìn)程環(huán)境下對(duì)共享資源的訪問(wèn)管理,以防止數(shù)據(jù)不一致或競(jìng)態(tài)條件,這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)樂(lè)觀鎖與悲觀鎖的相關(guān)資料,需要的朋友可以參考下
    2026-04-04
  • MySQL聚合、日期、字符串等函數(shù)深度剖析

    MySQL聚合、日期、字符串等函數(shù)深度剖析

    本文介紹了MySQL中常用函數(shù),通過(guò)示例說(shuō)明了每個(gè)函數(shù)的使用方法和應(yīng)用場(chǎng)景,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • MySQL中Nested-Loop Join算法小結(jié)

    MySQL中Nested-Loop Join算法小結(jié)

    數(shù)據(jù)庫(kù)中JOIN操作的實(shí)現(xiàn)主要有三種:嵌套循環(huán)連接(Nested Loop Join),歸并連接(Merge Join)和散列連接或者哈稀連接(Hash Join)。其中嵌套循環(huán)連接又視情況又有兩種變形:塊嵌套循環(huán)連接和索引嵌套循環(huán)連接。
    2015-12-12
  • Mysql執(zhí)行原理之索引合并步驟詳解

    Mysql執(zhí)行原理之索引合并步驟詳解

    這篇文章主要介紹了Mysql執(zhí)行原理之索引合并詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • 使用SQL查詢所有數(shù)據(jù)庫(kù)名和表名問(wèn)題

    使用SQL查詢所有數(shù)據(jù)庫(kù)名和表名問(wèn)題

    這篇文章主要介紹了使用SQL查詢所有數(shù)據(jù)庫(kù)名和表名問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論

建瓯市| 将乐县| 焦作市| 武川县| 巢湖市| 龙口市| 崇州市| 德江县| 邯郸市| 锡林浩特市| 岳普湖县| 象山县| 上栗县| 江口县| 琼结县| 紫阳县| 元江| 延庆县| 中卫市| 城固县| 类乌齐县| 康保县| 嘉义市| 镇安县| 利川市| 杭州市| 报价| 渭南市| 耒阳市| 巴彦县| 合阳县| 瑞安市| 云林县| 宣汉县| 灌云县| 望谟县| 霞浦县| 墨竹工卡县| 宜川县| 安乡县| 灵武市|