日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的

發(fā)布時間:2023/12/10 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1 一條SQL查詢語句是如何執(zhí)行的
    • 2 mysql體系結(jié)構(gòu)
    • 3 InnoDB存儲引擎
    • 4 總結(jié)

1 一條SQL查詢語句是如何執(zhí)行的

? 通常我們使用數(shù)據(jù)庫,都是將數(shù)據(jù)庫看成一個整體,我們的應(yīng)用與數(shù)據(jù)庫完全就是通過SQL語句進行交互。大多數(shù)開發(fā)者很少去了解數(shù)據(jù)庫的內(nèi)部實現(xiàn)原理,這樣也可以完成我們的應(yīng)用。但是如果遇到一些疑難問題,如查詢變慢、死鎖、數(shù)據(jù)庫宕機需要恢復(fù)數(shù)據(jù)時,我們就需要對數(shù)據(jù)庫的實現(xiàn)原理有一定的了解,才能解決這些問題。了解一個東西,先鳥瞰其全貌,再一步步深入到內(nèi)部。

? 想要了解mysql的基礎(chǔ)架構(gòu),從最簡單的SQL查詢語句來分析,當(dāng)了解了mysql是如何執(zhí)行一條SQL查詢語句后,就基本了解了mysql的基礎(chǔ)體系結(jié)構(gòu)。

? 下面是一條最簡單的SQL查詢語句:

select * from T where id = 2;

? 對于應(yīng)用開發(fā)者來說,看到的就是輸入一條語句,返回一個結(jié)果。下面是mysql的基本架構(gòu)簡單示意圖,這條語句會經(jīng)過這些過程。

? 大體來說,mysql可以分為server層和存儲引擎層。

  • server層包括
  • 連接器:連接器負責(zé)跟客戶端建立連接、獲取權(quán)限、維持和管理連接等。

  • 查詢緩存:建立連接后就應(yīng)該進行數(shù)據(jù)的查詢。在真正進行數(shù)據(jù)查詢之前,mysql會先到緩存查看,之前是否執(zhí)行過這條語句,如果執(zhí)行過,會在緩存中緩存這條查詢對應(yīng)的返回數(shù)據(jù),此時可以直接從緩存中獲取。如果不在緩存中,則繼續(xù)后面的流程。

    2.1 大多數(shù)情況下不建議使用查詢緩存的功能,因為查詢緩存弊大于利。查詢緩存失效非常頻繁,只要有對表的更新操作,這個表上所有的查詢緩存就會被清空,因此很有肯能你很費勁地把結(jié)果存起來,還沒使用就被一個更新操作清空了。對于更新壓力大的數(shù)據(jù)庫來說,查詢緩存的命中率非常低。mysql8.0以后直接將查詢緩存的功能刪掉了。

  • 分析器:如果沒有命中緩存,就開始這正的執(zhí)行查詢了。mysql首先會需要對你提交的SQL語句進行校驗與分析,看是否是正確的SQL語句。分析器主要包括詞法分析、語法分析,后面的文章會對其進行詳細的分析。

  • 優(yōu)化器:當(dāng)SQL語句校驗成功,沒有語法錯誤,會進行優(yōu)化器優(yōu)化,優(yōu)化器主要是在表里有多個索引的時候決定使用哪個索引,或者在一個語句有多表關(guān)聯(lián)(jion)的時候,決定各個表的連接順序。

  • 執(zhí)行器:mysql通過分析器知道了要做什么,通過優(yōu)化器知道了要怎么做。于是就進入了執(zhí)行階段,開始執(zhí)行語句。

  • 執(zhí)行的開始會先判斷你對這個表是否有權(quán)限。
  • 如果有權(quán)限則打開表繼續(xù)執(zhí)行,執(zhí)行器會根據(jù)表的存儲引擎的定義,來調(diào)用不同存儲引擎的api接口,查詢具體的數(shù)據(jù)。
  • ? 上面就是一條SQL查詢語句的簡單執(zhí)行過程,只是加單的描述了大概的流程,當(dāng)然里面的細節(jié)非常負責(zé),這在后面的文章中會進行一一拆解。

    2 mysql體系結(jié)構(gòu)

    ? 在了解了上面的一條SQL查詢語句的執(zhí)行流程后,我們再來看下,mysql完整的體系結(jié)構(gòu)是什么樣。

    ? 從以上mysql的體系結(jié)構(gòu)中可以看出,主要有以下幾個部分組成。

    • 連接池組件
    • 管理服務(wù)和工具組件
    • SQL接口組件
    • 查詢分析器組件
    • 優(yōu)化器組件
    • 緩沖組件插件式存儲引擎
    • 物理文件

    ? mysql數(shù)據(jù)庫區(qū)別于其他數(shù)據(jù)庫的最重要的一個特點就是其插件式的表存儲引擎。mysq插件式的存儲引擎架構(gòu)提供了一系列標(biāo)準(zhǔn)的管理和服務(wù)支持,這些標(biāo)準(zhǔn)與存儲引擎本身無關(guān),可能是每個數(shù)據(jù)庫系統(tǒng)本身都需要的,如SQL分析器和優(yōu)化器。存儲引擎是底層物理結(jié)構(gòu)的實現(xiàn),每個存儲引擎開發(fā)者可以按照自己的意愿來進行開發(fā)。

    ? 需要特別注意的是,存儲引擎是基于表的,而非數(shù)據(jù)庫的。我們最好牢記上面的mysql體系結(jié)構(gòu),對我們后面深入理解mysql數(shù)據(jù)庫有很大的幫助。

    3 InnoDB存儲引擎

    ? 我們已經(jīng)大致了解了mysql數(shù)據(jù)庫獨有的插件式體系結(jié)構(gòu),病了解到存儲引擎是mysql數(shù)據(jù)庫區(qū)別于其他數(shù)據(jù)庫的一個最重要的特性。存儲引擎的好處是,每個存儲引擎都有各自的特點,能夠根據(jù)具體的應(yīng)用建立不同的存儲引擎表。我們業(yè)務(wù)應(yīng)用開發(fā)平時所說的事務(wù)、鎖、B+樹索引等,也都是在存儲引擎層實現(xiàn)的。其中InnoDB存儲引擎是目前最常用的一種存儲引擎,所以我們總是圍繞著InnoDB的原理進行講解。

    ?

    ? InnoDB存儲引擎支持事務(wù),其設(shè)計的主要目標(biāo)是面向在線事務(wù)處理的應(yīng)用(OLTP),其特點是行鎖設(shè)計、支持外鍵、并通過使用多版本并發(fā)控制支持一致性非鎖定讀。并且實現(xiàn)了SQL的四種隔離級別。默認為RR(REPEATABLE READ)隔離級別,同時使用next-key locking 的策略來避免幻讀(phantom)現(xiàn)象的產(chǎn)生。除此之外,InnoDB存儲引擎還提供了插入緩沖(insert buffer)、二次寫(double write)、自適應(yīng)哈希索引、預(yù)讀(read ahead)等高性能和高可用的功能。

    ? 對于標(biāo)準(zhǔn)紅數(shù)據(jù)的存儲,InnoDB采用聚集(clustered)的方式,因此每張表的存儲都是按照主鍵的順序進行存放。

    4 總結(jié)

    ? 本文是接下來對mysql數(shù)據(jù)庫拆解,并深入分析的基礎(chǔ),我們主要掌握mysql體系結(jié)構(gòu)的圖,把上面的圖背下來也行,對后面理解索引、鎖、以及mysql優(yōu)化都有莫大的好處。

    總結(jié)

    以上是生活随笔為你收集整理的【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。