濮阳杆衣贸易有限公司

主頁 > 知識庫 > MySQL Select語句是如何執(zhí)行的

MySQL Select語句是如何執(zhí)行的

熱門標簽:申請外呼電話線路 南通自動外呼系統(tǒng)軟件 百度地圖圖標標注中心 廣東人工電話機器人 石家莊電商外呼系統(tǒng) 芒果電話機器人自動化 信陽穩(wěn)定外呼系統(tǒng)運營商 湖南人工外呼系統(tǒng)多少錢 日照旅游地圖標注

MySQL Select語句是怎么執(zhí)行的?

   最近在極客時間看丁奇大佬的《MySQL45講》,真心覺得講的不錯,把其中獲得的一些MySQL方向的經驗整理整理分享給大家,有興趣同學可以購買相關課程進行學習。

   今天分享的內容是select和update的執(zhí)行流程。

select的執(zhí)行過程

話不多說,來個神圖鎮(zhèn)樓(自己畫的)。

   首先,我們可以看到,整個select語句包含三個模塊,其中客戶端和MySQL兩個部分,MySQL又包含server端和存儲引擎?zhèn)?,server端包含連接器、查詢緩存、分析器、優(yōu)化器,執(zhí)行器等多個部分,存儲引擎?zhèn)韧瑯影琲nnodb、Myisam,memory等多種存儲引擎。

每個模塊的作用如下:

連接器:

   連接器的任務是跟客戶端建立連接,查詢權限,維持和管理連接等等。當我們使用命令行登錄時,如果密碼或者賬號錯誤,那么連接器會返回給我們Access Deny的報錯,利用正確的賬號密碼登錄到MySQL之后,連接器會查詢當前賬號的登錄權限,之后的所有操作,都是依賴這個權限進行的。

注意,如果此時我們更改了該賬號的權限,并不會對已經存在的連接產生影響,而只對新加入的連接產生影響。

   如果客戶端連接進入MySQL后,一直沒有進行任何操作,那么連接器將會在wait_timeout參數設置的時間后,將該連接斷開。建議在程序中使用長連接,這樣可以減小和客戶端和MySQL建立連接的帶來的性能損耗。

查詢緩存:

當客戶端輸入一個SQL之后,如果命中查詢緩存,那么MySQL將會直接返回結果,而不進行下面的一系列分析操作,如果沒有命中,則開始進入分析器---優(yōu)化器---執(zhí)行器這個流程。關于查詢緩存,還有2點需要注意:

a、MySQL8.0中開始棄用查詢緩存,因為查詢緩存的命中率一般較低,弊大于利。

b、在高并發(fā)場景中,建議將查詢緩存關閉,關閉時使用query_cache_type=off或者query_cache_size=0。

c、如果非要使用這個功能,可以將參數query_cache_type設置成DEMAND,這樣,就可以使用select sql_cache  * from table這種方式強制使用查詢緩存的功能了。

分析器:

如果我們的查詢沒有真正命中查詢緩存,那么就要進入分析器這個環(huán)節(jié)了,分析器的主要功能是詞法分析和語法分析,其中:

詞法分析指的是根據SQL分析出來select、update、alter、列名、表名、庫名等;

語法分析是指需要分析你寫的SQL是否滿足MySQL的語法。如果不滿足,則會給出you have an error xxx的提示。

優(yōu)化器:

   優(yōu)化器的作用是選出SQL執(zhí)行的最佳路徑,例如在多表join的時候,優(yōu)化器會選擇最高效的方案來執(zhí)行連接查詢。這里可以給出一個例子,例如我們建立了(a,b)的聯合索引,

select * from table where a=1 and b=1;

select * from table where b=1 and a=1;

這兩條SQL是等價的,因為優(yōu)化器會將下面的改造成上面的樣子,從而應用聯合索引進行搜索查詢。

執(zhí)行器:

  SQL經過優(yōu)化器之后,就會進入執(zhí)行器,執(zhí)行SQL前,需要校驗表的權限,如果有權限,會根據表的存儲引擎定義,去使用這個存儲引擎提供的接口,最終將數據返回給客戶端,并開始等待新的連接。

這里需要注意一點:執(zhí)行器調用一次,在引擎內部則掃描了多行,因此存儲引擎掃描行數跟rows_examined并不是完全相同的。

Q A

Q1:為什么對權限的檢查不在優(yōu)化器之前做?

A1:有些時候,SQL語句要操作的表不只是SQL字面上那些。比如如果有個觸發(fā)器,得在執(zhí)行器階段(過程中)才能確定。優(yōu)化器階段前是無能為力的

Q2:MySQL權限到底在哪里驗證?

A2:賬號的登錄權限在連接器模塊驗證;表的操作權限分為兩種情況,如果命中查詢緩存,會在查詢緩存放回結果的時候驗證,在優(yōu)化器之前,如果沒有命中索引,則權限驗證在執(zhí)行器模塊驗證。

以上就是MySQL Select語句是如何執(zhí)行的的詳細內容,更多關于MySQL Select語句的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • 淺談MySQL之select優(yōu)化方案
  • MySQL將select結果執(zhí)行update的實例教程
  • 解決MySQL讀寫分離導致insert后select不到數據的問題
  • MySQL之select in 子查詢優(yōu)化的實現
  • mysql學習筆記之完整的select語句用法實例詳解
  • MySQL select、insert、update批量操作語句代碼實例
  • 簡單了解MySQL SELECT執(zhí)行順序
  • mysql事務select for update及數據的一致性處理講解
  • MySQL中Update、select聯用操作單表、多表,及視圖與臨時表的區(qū)別
  • mysql select緩存機制使用詳解
  • MySql數據庫中Select用法小結
  • 論一條select語句在MySQL是怎樣執(zhí)行的

標簽:公主嶺 沈陽 牡丹江 惠州 阿里 呼和浩特 天津 合肥

巨人網絡通訊聲明:本文標題《MySQL Select語句是如何執(zhí)行的》,本文關鍵詞  MySQL,Select,語句,是,如何,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL Select語句是如何執(zhí)行的》相關的同類信息!
  • 本頁收集關于MySQL Select語句是如何執(zhí)行的的相關信息資訊供網民參考!
  • 推薦文章
    曲靖市| 永新县| 长海县| 林甸县| 新干县| 江陵县| 渭南市| 偏关县| 绍兴县| 沁源县| 鄢陵县| 阜阳市| 濮阳县| 娱乐| 嘉鱼县| 杭锦后旗| 南澳县| 屯昌县| 双牌县| 吉安市| 四平市| 从江县| 湘潭市| 保德县| 安吉县| 东源县| 德昌县| 保靖县| 龙岩市| 错那县| 怀宁县| 连山| 南岸区| 荃湾区| 阜宁县| 镇坪县| 新民市| 瓮安县| 石泉县| 大理市| 禹州市|