mysql数据库查询语句过程_mysql(一) SQL查询语句执行过程
mysql基礎(chǔ)架構(gòu) 示意圖
首先 mysql? 大概分為 server層 和 存儲引擎層 兩個部分, 引擎的架構(gòu)模式是插件形式的,mysql支持多種引擎如 InnoDB、MyISAM、Memory 等,其中 Innodb是應(yīng)用最廣泛的,mysql5.5.5版本后,將Innodb設(shè)為默認(rèn)存儲引擎。
連接器:
連接器負(fù)責(zé)跟客戶端建立連接、獲取權(quán)限、維持和管理連接。
一個用戶成功建立連接后,即使你用管理員賬號對這個用戶的權(quán)限做了修改,也不會影響已經(jīng)存在連接的權(quán)限。修改完成后,只有再新建的連接才會使用新的權(quán)限設(shè)置。
連接完成后,如果你沒有后續(xù)的動作,這個連接就處于空閑狀態(tài),你可以在 show processlist 命令中看到它。文本中這個圖是 show processlist 的結(jié)果,其中的 Command 列顯示為“Sleep”的這一行,就表示現(xiàn)在系統(tǒng)里面有一個空閑連接。
客戶端如果太長時間沒動靜,連接器就會自動將它斷開。這個時間是由參數(shù) wait_timeout 控制的,默認(rèn)值是 8 小時。如果在連接被斷開之后,客戶端再次發(fā)送請求的話,就會收到一個錯誤提醒: Lost connection to MySQL server during query。這時候如果你要繼續(xù),就需要重連,然后再執(zhí)行請求了。
show variables like 'wait_timeout' ;
show processlist
數(shù)據(jù)庫連接分為? 長連接 和短連接 兩種 ,長連接 可以復(fù)用,短連接則是指每次執(zhí)行完很少的幾次查詢就斷開連接,下次查詢再重新建立一個。
緩存:
緩存命中的條件比較苛刻,必須是查詢語句完全一樣,并且查詢語句中相關(guān)表未在緩存后執(zhí)行update insert等更新語句。所以盡量不要啟用緩存功能。
分析器:
做語句 詞法分析 判斷sql語句是否存在錯誤以及 錯誤列名/表名。
例: MySQL 從你輸入的"select"這個關(guān)鍵字識別出來,這是一個查詢語句。它也要把字符串“T”識別成“表名 T”,把字符串“ID”識別成“列 ID”。
優(yōu)化器:
生成執(zhí)行計劃,決定使用哪個索引,決定選擇join語句的驅(qū)動表。
執(zhí)行器:
開始執(zhí)行的時候,要先判斷一下你對這個表 T 有沒有執(zhí)行查詢的權(quán)限,如果沒有,就會返回沒有權(quán)限的錯誤。
如果有權(quán)限,就打開表繼續(xù)執(zhí)行。打開表的時候,執(zhí)行器就會根據(jù)表的引擎定義,去使用這個引擎提供的接口。
比如表 T 中,ID 字段沒有索引,那么執(zhí)行器的執(zhí)行流程是這樣的:
調(diào)用 InnoDB 引擎接口取這個表的第一行,判斷 ID 值是不是 10,如果不是則跳過,如果是則將這行存在結(jié)果集中;
調(diào)用引擎接口取“下一行”,重復(fù)相同的判斷邏輯,直到取到這個表的最后一行。
執(zhí)行器將上述遍歷過程中所有滿足條件的行組成的記錄集作為結(jié)果集返回給客戶端。至此,這個語句就執(zhí)行完成了。
對于有索引的表,執(zhí)行的邏輯也差不多。第一次調(diào)用的是“取滿足條件的第一行”這個接口,之后循環(huán)取“滿足條件的下一行”這個接口,這些接口都是引擎中已經(jīng)定義好的。
你會在數(shù)據(jù)庫的慢查詢?nèi)罩局锌吹揭粋€ rows_examined 的字段,表示這個語句執(zhí)行過程中掃描了多少行。
這個值就是在執(zhí)行器每次調(diào)用引擎獲取數(shù)據(jù)行的時候累加的。
在有些場景下,執(zhí)行器調(diào)用一次,在引擎內(nèi)部則掃描了多行,因此引擎掃描行數(shù)跟 rows_examined 并不是完全相同的。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的mysql数据库查询语句过程_mysql(一) SQL查询语句执行过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python是开源工具吗_微软最强 Py
- 下一篇: html文件打开多出很多数字,【求助】页