客戶端 =》 聯結器 =》 查詢快取 =》 有快取 =》 返回客戶端
=》 沒有快取 =》 分析器 =》 優化器 =》 執行器 =》 binlog[歸檔日誌] =》 儲存引擎
以上可以分為兩個部分:
首先來說[聯結器],也就是我們每次使用mysql
的時候,我們需要輸入host ip username password來做連線登入mysql
,我們做了這個之後,mysql
需要作出回應呀,看看有沒有這個叫[什麼鬼]的小夥子,再看看這個[什麼鬼]小夥子有沒有一系列的[特權]呀。。。就拿php
來說,在使用mysql
的時候,不管是
mysqli
還是pdo
,都需先去連線mysql
,同樣的mysql
在這些連線後也需要作出回應,那麼這個[守門的]就是聯結器。同時也需要注意:mysql
的
聯結器,比如說我們當前的使用者test
,它現在是乙個屌絲,什麼都沒有,它連上了mysql
,但是之後,突然走了狗shi運。牛pi了。但是,它進去mysql
之後就沒有
出來過,那麼就相當於它還沒有拿到特權,還是個屌絲。只有它重新離開再進去,它的特權才能生效。
通訊方式 【半雙工–對講機】【全雙工–打**】【單工–收音機】
mysql 是半雙工
客戶端一旦開始傳送訊息另一端要接受完整個訊息才能響應
客戶端一旦開始接受資料沒法停下來傳送指令
show processlist;/show full processlist;
sleep
query
locked
sorting result
執行緒正在
sending data
向請求端返回資料
再來說[快取],mysql
的快取預設是沒有開啟的,也就是要我們手動開啟。
show variables like query_cache_type= 0關閉 | 1開啟 | 2按需開啟
它的快取儲存形式就是像key => value
這種形式,key
就是我們的查詢語句,比如:select * from users;
它的value
就是我們查詢到的結果集。如果
我們開啟快取這個功能呢,我們第一次查詢結果就會放到快取中。第二次再次查詢[相同的]的語句,就會命中快取。它就會直接返回快取中的結果集,沒有命中,
就會再次查詢。雖然說快取比較好,有時也加快了我們的查詢速度,但是,但是,但是。它的使用限制確實非常有限。
1.) 要想命中快取,兩次的查詢語句必須一模一樣
2.) 查詢的時候,select
必須是作用於表,也就是你的select * from [table_name];
才有作用,如果是select 1+1;
這是不會有快取產生的
3.) 比如我們第一查詢的時候,有一條記錄,在第二次查詢的時候,你新增了一條記錄,那麼快取一樣會失效。就是我們只要涉及到[增,刪,改]快取馬上就不會起作用了,
就算是和第一次的查詢語句一樣,快取也會失效
4.) 就是我們要得到的資料塊,特別大,特別多的時候,我們使用快取這也是非常消耗記憶體的
5.) 當查詢的時候,我們使用函式,那麼快取一樣不會起作用
檢視是否使用快取語句show status like "qcache%"
[分析器] 在mysql
沒有命中快取的時候,就會到達下一站,分析器。分析器又分為詞法分析和語法分析。
詞法分析:就是mysql
它的一條sql語句由那些組成,就是mysql
自己的分詞[token],我的理解應該就是把寫的一條sql語句一點一點整理出來,然後組成
mysql
它自己所能識別的
語法分析:語法分析應該就是分析經過詞法分析的sql語句是否符合mysql
的語法
[優化器] 到了這一階段,可以說,基本上已經走到了一半了。但是還有乙個預處理階段和查詢優化器階段;其實查詢優化,就好比是查詢執行的路徑
使用等價變化規則
優化count min max 等函式
覆蓋索引掃瞄
子查詢優化
提前終止查詢 limit 100
in的優化 【全表掃瞄】
[執行器] 這基本就是最後階段了,呼叫執行引擎。當選擇了最有的執行方案或執行路徑之後,mysql就會執行你的sql語句了。
[返回客戶端] 最後返回你的就是成功或者失敗,以及失敗原因
mysql學習(二) sql執行流程
上篇文章對mysql的基本架構和儲存引擎有了簡單的認識,今天我們需要對sql的執行流程有個簡單的認識,通過這篇文章,我們可以詳細的了解並知道一條sql在mysql中是如何執行下來的。大體來說,mysql主要分為server層和儲存資料層 儲存引擎層 server層包括聯結器 查詢快取 分析器 優化器...
mysql執行語句 mysql執行sql語句過程
流程概述 mysql得到sql語句後,大概流程如下 1.sql的解析器 負責解析和 sql 2.預處理器 對解析後的sql樹進行驗證 3.查詢優化器 得到乙個執行計畫 4.查詢執行引擎 得到資料結果集 5.將資料放回給呼叫端。流程圖如下所示 分發器及快取階段 首先,如果系統的快取功能開啟著的話,sq...
mysql的sql執行計畫
引言 實際專案開發中,由於我們不知道實際查詢的時候資料庫裡發生了什麼事情,資料庫軟體是怎樣掃瞄表 怎樣使用索引的,因此,我們能感知到的就只有 sql語句執行的時間,在資料規模不大時,查詢是瞬間的,因此,在寫sql語句的時候就很少考慮到效能的問題。但是當資料規模增大,如千萬 億的時候,我們運 行同樣的...