MySQL 運行機制

1. 運行機制圖解

2. 運行過程

2.1 建立連接(Connectors & Connection Pool)

通過 客戶端/服務(wù)器通信協(xié)議MySQL 建立連接。MySQL 客戶端與服務(wù)端的通信方式是“ 半雙工 ”递宅。對于每一個 MySQL 的連接玄货,時刻都有一個線程狀態(tài)來標(biāo)識這個連接正在做什么。

通訊機制:

  • 全雙工:能同時發(fā)送和接收數(shù)據(jù),例如平時打電話。
  • 半雙工:指的某一時刻称近,要么發(fā)送數(shù)據(jù),要么接收數(shù)據(jù)曹鸠,不能同時煌茬。例如早期對講機
  • 單工:只能發(fā)送數(shù)據(jù)或只能接收數(shù)據(jù)。例如單行道

線程狀態(tài):

show processlist; //查看用戶正在運行的線程信息彻桃,root 用戶能查看所有線程,其他用戶只能看自己的

在這里插入圖片描述

Id: 線程ID晾蜘,可以使用 kill xx殺死當(dāng)前線程邻眷;
image

User:啟動這個線程的用戶

Host:發(fā)送請求的客戶端的IP端口號

db:當(dāng)前命令在哪個庫執(zhí)行

Command:該線程正在執(zhí)行的操作命令

  • Create DB:正在創(chuàng)建庫操作
  • Drop DB:正在刪除庫操作
  • Execute:正在執(zhí)行一個PreparedStatement
  • Close Stmt:正在關(guān)閉一個PreparedStatement
  • Query:正在執(zhí)行一個語句
  • Sleep:正在等待客戶端發(fā)送語句
  • Quit:正在退出
  • Shutdown:正在關(guān)閉服務(wù)器

Time:表示該線程處于當(dāng)前狀態(tài)的時間,單位是秒

State:線程狀態(tài)

  • Updating:正在搜索匹配記錄剔交,進行修改
  • Sleeping:正在等待客戶端發(fā)送新請求
  • Starting:正在執(zhí)行請求處理
  • Checking table:正在檢查數(shù)據(jù)表
  • Closing table: 正在將表中數(shù)據(jù)刷新到磁盤中
  • Locked:被其他查詢鎖住了記錄
  • Sending Data:正在處理Select查詢肆饶,同時將結(jié)果發(fā)送給客戶端

Info:一般記錄線程執(zhí)行的語句,默認顯示前100個字符岖常。

show full processlist; // 查看完整的線程執(zhí)行語句

2.2 查詢緩存(Cache & Buffer)

這是 MySQL 的一個可優(yōu)化查詢的地方驯镊,如果開啟了查詢緩存且在查詢緩存過程中查詢到完全相同的 SQL 語句,則將查詢結(jié)果直接返回給客戶端竭鞍;如果沒有開啟查詢緩存或者沒有查詢到完全相同的 SQL 語句則會由解析器進行語法語義解析板惑,并生成“解析樹”。

  • 緩存 Select 查詢的結(jié)果和 SQL 語句

  • 執(zhí)行 Select 查詢時偎快,先查詢緩存冯乘,判斷是否存在可用的記錄集,要求完全相同(包括參數(shù)值)晒夹,這樣才會匹配緩存數(shù)據(jù)命中裆馒。

  • 即使開啟查詢緩存姊氓,以下 SQL 也不能緩存

    • 查詢語句使用 SQL_NO_CACHE
    • 查詢的結(jié)果大于 query_cache_limit 設(shè)置
    • 查詢中有一些不確定的參數(shù),比如 now()
show variables like '%query_cache%'; //查看查詢緩存是否啟用喷好,空間大小翔横,限制等
show status like 'Qcache%'; //查看更詳細的緩存參數(shù),可用緩存空間梗搅,緩存塊棕孙,緩存多少等

2.3 解析器(Parser)

將客戶端發(fā)送的 SQL 進行語法解析,生成 "解析樹" 些膨。預(yù)處理器根據(jù)一些 MySQL 規(guī)則進一步檢查 “解析樹” 是否合法蟀俊,例如這里將檢查數(shù)據(jù)表和數(shù)據(jù)列是否存在,還會解析名字和別名订雾,看看它們是否有歧義肢预,最后生成新的 “解析樹”

2.4 查詢優(yōu)化器(Optimizer)

根據(jù) “解析樹” 生成最優(yōu)的執(zhí)行計劃洼哎。MySQL 使用很多優(yōu)化策略生成最
優(yōu)的執(zhí)行計劃烫映,可以分為兩類:靜態(tài)優(yōu)化(編譯時優(yōu)化)、動態(tài)優(yōu)化(運行時優(yōu)化)噩峦。

等價變換策略

  • 5 = 5 and a > 5 改成 a > 5
  • a < b and a = 5 改成 b > 5 and a = 5
  • 基于聯(lián)合索引锭沟,調(diào)整條件位置等

優(yōu)化 count、min识补、max 等函數(shù)

  • InnoDB 引擎 min函數(shù)只需要找索引最左邊
  • InnoDB 引擎 max 函數(shù)只需要找索引最右邊
  • MyISAM 引擎 count(*)族淮,不需要計算,直接返回

提前終止查詢

  • 使用了 limit 查詢凭涂,獲取 limit 所需的數(shù)據(jù)祝辣,就不在繼續(xù)遍歷后面數(shù)據(jù)

in 的優(yōu)化

  • MySQLin 查詢,會先進行排序切油,再采用二分法查找數(shù)據(jù)蝙斜。比如 where id in (2,1,3),變成 where id in (1,2,3)

2.5 查詢執(zhí)行引擎

負責(zé)執(zhí)行 SQL 語句澎胡,此時查詢執(zhí)行引擎會根據(jù) SQL 語句中表的存儲引擎類型孕荠,以及對應(yīng)的 API 接口底層存儲引擎緩存 或者 物理文件 的交互,得到查詢結(jié)果并返回給客戶端攻谁。若開啟查詢緩存稚伍,這時會將 SQL 語句和結(jié)果完整地保存到查詢緩存(Cache&Buffer)中,以后若有相同的 SQL 語句執(zhí)行則直接返回結(jié)果巢株。

  • 如果開啟了查詢緩存槐瑞,先將查詢結(jié)果做緩存操作
  • 返回結(jié)果過多,采用增量模式返回
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阁苞,一起剝皮案震驚了整個濱河市困檩,隨后出現(xiàn)的幾起案子祠挫,更是在濱河造成了極大的恐慌,老刑警劉巖悼沿,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件等舔,死亡現(xiàn)場離奇詭異,居然都是意外死亡糟趾,警方通過查閱死者的電腦和手機慌植,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來义郑,“玉大人蝶柿,你說我怎么就攤上這事》峭裕” “怎么了交汤?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長劫笙。 經(jīng)常有香客問我芙扎,道長,這世上最難降的妖魔是什么填大? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任戒洼,我火速辦了婚禮,結(jié)果婚禮上允华,老公的妹妹穿的比我還像新娘圈浇。我一直安慰自己,他們只是感情好例获,可當(dāng)我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布汉额。 她就那樣靜靜地躺著,像睡著了一般榨汤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怎茫,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天收壕,我揣著相機與錄音,去河邊找鬼轨蛤。 笑死蜜宪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祥山。 我是一名探鬼主播圃验,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缝呕!你這毒婦竟也來了澳窑?” 一聲冷哼從身側(cè)響起斧散,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摊聋,沒想到半個月后鸡捐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡麻裁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年箍镜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煎源。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡色迂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出手销,到底是詐尸還是另有隱情歇僧,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布原献,位于F島的核電站馏慨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏姑隅。R本人自食惡果不足惜写隶,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讲仰。 院中可真熱鬧慕趴,春花似錦、人聲如沸鄙陡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趁矾。三九已至耙册,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毫捣,已是汗流浹背详拙。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔓同,地道東北人饶辙。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像斑粱,于是被迫代替她去往敵國和親弃揽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 要理解MySQL的運行機制,先要看一下MySQL的語句是一個基本的執(zhí)行過程矿微,我們在客戶端寫的SQL先查緩存痕慢,緩存命...
    david161閱讀 484評論 0 0
  • 本文來自于拜讀《高性能MySQL(第三版)》時的讀書筆記作者:安明哲轉(zhuǎn)載時請注明部分內(nèi)容來自《高性能MySQL(第...
    代號027閱讀 5,488評論 0 21
  • mysql體系結(jié)構(gòu) 關(guān)于mysql的整體體系結(jié)構(gòu)如下: Client Connectors接入方 支持協(xié)議很多Ma...
    先生zeng閱讀 883評論 0 2
  • hive介紹hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表冷冗,并提供簡單的s...
    weare_b646閱讀 187評論 0 0
  • 今天感恩節(jié)哎守屉,感謝一直在我身邊的親朋好友。感恩相遇蒿辙!感恩不離不棄拇泛。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,567評論 0 11