成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:你說說一條查詢SQL的執行過程?

運維 數據庫運維
為了理解這個問題,先從Mysql的架構說起,對于Mysql來說,大致可以分為3層架構。

[[414987]]

為了理解這個問題,先從Mysql的架構說起,對于Mysql來說,大致可以分為3層架構。

第一層作為客戶端和服務端的連接,連接器負責處理和客戶端的連接,還有一些權限認證之類。比如客戶端通用用戶名密碼連接到Mysql服務器,還有對于數據庫表的執行權限。

第二層是核心層,基本上Mysql大部分的核心功能都在這一層,包括查詢緩存、解析器、優化器之類,比如SQL解析、優化、索引選擇,到最后生成執行計劃。

第三層則是存儲引擎了,Mysql通過執行引擎直接調用存儲引擎API查詢數據庫中數據。

通過Mysql的架構分層,我們首先就可以很清晰的了解到一個SQL的大概的執行過程。

  1. 首先客戶端發送請求到服務端,建立連接。
  2. 服務端先看下查詢緩存是否命中,命中就直接返回,否則繼續往下執行。
  3. 接著來到解析器,進行語法分析,一些系統關鍵字校驗,校驗語法是否合規。
  4. 然后優化器進行SQL優化,比如怎么選擇索引之類,然后生成執行計劃。
  5. 最后執行引擎調用存儲引擎API查詢數據,返回結果。

這就是一個很概括性的SQL執行過程,接下來,具體到每個步驟詳細說明一下。

查詢緩存

如果你翻看Mysql的官方文檔就會知道,查詢緩存在5.7.20版本已經被棄用,并且8.0的版本已經刪除了。為啥要刪除,可能覺得太雞肋了吧。

我們可以通過命令來查看查詢緩存是否可用。

  1. mysql> SHOW VARIABLES LIKE 'have_query_cache'
  2. +------------------+-------+ 
  3. | Variable_name    | Value | 
  4. +------------------+-------+ 
  5. | have_query_cache | YES   | 
  6. +------------------+-------+ 

除此之外,查詢緩存還有一些核心參數。更具體的說明可以參考官方文檔。

query_cache_type:是否打開查詢緩存,值為0\1\2,分別對應為OFF\ON\DEMAND,ON的話則代表開啟查詢緩存,但是可以通過SELECT SQL_NO_CACHE來手動禁用,DEMAND則代表只緩存以SELECT SQL_CACHE開頭的SQL語句。

query_cache_limit:緩存結果大小限制,如果查詢結果超過大小則不會被緩存,默認是1M大小。

query_cache_size:為查詢緩存分配的內存大小,他是1024的整數倍。

query_cache_min_res_unit:查詢緩存分配內存塊的最小單位,默認為4KB。這是查詢緩存分配內存的基本單位,即便比如查詢的數據只有1個字節,也會按照最小內存單元大小來分配內存空間。

在進行SQL解析之前,系統會判斷查詢緩存是否打開,如果打開,就拿緩存中的查詢和傳入的查詢比較,如果完全一樣,就會從緩存中直接返回。

但是需要特別注意的是,無論大小寫、空格還是注釋,都會影響緩存的命中結果,也就是說必須完全一樣!

比如以下的SQL大小寫不同、多了空格都無法命中查詢緩存。

  1. select * from user
  2. SELECT * from user
  3. select   * from user

解析器&預處理器

如果查詢緩存未命中,就會進入正常的SQL執行環節。

首先就像我們正常的業務開發一樣,第一步都是對參數的規則校驗,Mysql也一樣,解析器會進行詞法語法分析,基于語法規則對SQL進行校驗。

比如關鍵字是否使用正確啊,或者說關鍵字順序是不是正確,比如說你把select寫成了selct,order by寫成了by order。

如果校驗OK,那么就生成一顆“解析樹”。

接著預處理器就是進一步依據合法規則生成的解析樹進行校驗,比如表名、列名是否存在等等。

優化器

如果說解析器和預處理器是我們業務邏輯的前置校驗環節,優化器就是真正的處理業務邏輯的地方。

一條查詢SQL可以有N種執行方式,優化器的最終目標是找到最好的執行計劃,交給執行引擎去執行。

但是實際使用中我們經常會發現,Mysql經常有選擇錯索引的情況,我明明有更快的索引,結果它不用,導致搞出了慢查詢。

這是因為Mysql的優化器是基于成本模型的優化器,他只是基于已有的成本計算公式來選擇一個成本最低的執行方式,這個執行方式不一定會是最快的,只能說大多數時候,優化器的選擇比我們自己的選擇更準確。

總的來說,這個優化過程太復雜了,流程大致就是下圖所示,更詳細的內容可以看《數據庫查詢優化器的藝術原理解析與SQL性能》這本書(我實在是懶得看了,吐了)。

執行引擎

大部分核心的事情已經被優化器處理完了,最后執行引擎只要根據生成好的執行計劃查詢數據返回就好了,這一步相對就挺簡單了。

執行引擎只需要根據執行計劃的指令調用存儲引擎的API就可以了。

當然這一步如果可以緩存查詢結果,那么就在這個階段把查詢結果緩存下來,然后把結果返回給客戶端就可以了。

總結

 

一圖勝千言。

本文轉載自微信公眾號「艾小仙」,可以通過以下二維碼關注。轉載本文請聯系艾小仙公眾號。

 

責任編輯:武曉燕 來源: 艾小仙
相關推薦

2020-07-03 07:39:45

查詢語句

2024-11-19 15:13:02

2023-12-27 18:16:39

MVCC隔離級別幻讀

2025-04-16 00:00:01

JWT客戶端存儲加密令

2021-11-25 10:18:42

RESTfulJava互聯網

2021-08-09 07:47:40

Git面試版本

2021-05-19 08:40:36

DNS 協議查詢

2024-07-29 09:49:00

SQLMySQL執行

2021-06-29 09:47:34

ReactSetState機制

2020-12-01 08:47:36

Java異常開發

2020-06-12 15:50:56

options前端服務器

2025-04-01 00:00:00

項目CRUD單例模式

2024-09-12 08:35:06

2023-11-01 16:50:58

2023-12-19 09:24:22

LinuxBIOSUEFI

2020-08-17 07:40:19

消息隊列

2022-02-11 14:43:53

SQL語句C/S架構

2024-03-05 10:33:39

AOPSpring編程

2024-08-22 10:39:50

@Async注解代理

2025-04-08 00:00:00

@AsyncSpring異步
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本高清视频网站 | 精品一区二区三区视频在线观看 | 欧美成人激情 | 99久久免费精品视频 | 国产精品福利视频 | 狠狠婷婷综合久久久久久妖精 | 国产成人免费观看 | 亚洲成人av一区二区 | 成人福利网站 | 成人国产精品一级毛片视频毛片 | 亚洲人成人一区二区在线观看 | 午夜视频在线免费观看 | 久久99成人| 啪啪免费 | 欧美日韩在线免费观看 | 久久免费精品 | 中文字幕国 | 久久99精品国产 | 7777在线 | 一区二区三区四区在线视频 | 99精品国产一区二区青青牛奶 | 黄色网址大全在线观看 | 国产黄色av电影 | 天天色综网 | 亚洲精选一区 | 午夜色婷婷 | 做a视频| 欧美综合在线观看 | www成人免费视频 | 国产成人亚洲精品 | 亚洲免费一区 | 亚洲 成人 av | 91亚洲国产成人精品一区二三 | 51ⅴ精品国产91久久久久久 | 秋霞电影一区二区 | 国产成人综合在线 | 亚洲日本一区二区三区四区 | 亚洲精品日韩一区二区电影 | 欧美一区二区在线 | 国产91丝袜在线18 | 福利片在线观看 |