mysql直连1.执行语句_MySQL随笔01_一条SQL语句是如何执行的
一、MySQL基礎架構示意圖
二、MySQL分層
總體來講,MySQL可以分為二層:Server層 和 存儲引擎 兩部分,如下圖所示。
不同的存儲引擎共用一個Server層。
三、各部分組件概述
連接器
負責與客戶端建立連接、獲取權限、維持和管理連接。比如常規的連接MySQL Server的命令如下
mysql -h$ip -P$port -u$user -p
回車-->輸入密碼
命令中的mysql是客戶端工具,用來與服務端建立連接,通過TCP協議進行連接。
2.MySQL客戶端 與 Server連接器連接成功后 進行身份認證,若是認證通過,連接器則會到權限表查詢用戶所擁有的權限。
一旦客戶端與Server之間成功建立連接,當前連接將會保持已查詢到的用戶權限,即使是管理員賬號對用戶權限做了修改,也不會影響已經存在的連接權限,即新權限對新的連接生效。
連接完成后,若是沒有后續動作,則連接處于空閑狀態,可以通過 show processlist命令查看連接的狀態。Command 列即為連接當前所處的狀態。
客戶端若是長時間沒有使用,連接器會自動斷開連接,可通過參數 wait_timeout 來設置,默認為8小時。
若是客戶端與Server之間的連接 被連接器超時斷開后,客戶端再次發送請求時,則會收到“丟失連接”錯誤,若是要繼續操作則需要進行重連。
關于數據庫的連接
長連接 指連接成功后,如果客戶端持續有請求,則一直使用同一個連接。
短連接 指 每次執行完很少的幾次查詢就斷開連接,下次查詢再重新創建一個連接。
建立連接通常比較復雜 以及耗費資源,因此,在使用過程中要盡量減少建立連接的動作,即 盡量使用長連接。
關于使用長連接時,有些時候MySQL占用內存增長很快的問題
原因 MySQL在執行過程中臨時使用的內存是管理在連接對象里面的,被占用的內存資源 是在連接斷開的時候才釋放。
后果 長連接隨著使用時間不斷累積下來,可能導致內存占用太大,被系統強制殺掉(OOM),從表現上來看就是MySQL異常重啟了。
解決方案
1). 定期斷開長連接。 使用一段時間、或者程序中判斷執行過一個占用內存大的查詢后,斷開連接,之后查詢再重連。
2). 如果使用的是MySQL 5.7或更高版本,可以在每次執行一個比較大的操作后,通過 mysql_reset_connection 來重新初始化連接資源(釋放連接所占用的內存資源)。
這個重置連接的操作,不需要重連和重新做權限驗證,但是可以將連接恢復到新創建完連接時的狀態。
查詢緩存
在客戶端與MySQL Server建立連接后,就可以進行DML等操作了。
MySQL中,對于之前執行過的語句及其結果 可能會以key-value 對的形式被直接緩存在內存中,key為查詢語句,value是查詢結果。
MySQL收到查詢請求時,會先到查詢緩存查找:
若命中緩存key,則直接返回value結果給客戶端,MySQL不需要繼續執行后面的操作——效率高;
若語句不在查詢緩存中,則會執行后面的各執行階段。執行完成后,執行結果被保存到查詢緩存中。
大多數情況下不建議使用查詢緩存——>>查詢緩存的使用 往往 弊大于利。
為什么?——查詢緩存的失效非常頻繁,只要有對一個表有更新,則這個表上的所有查詢緩存都會被清空。 對于更新頻繁的數據庫來說,查詢緩存的命中率非常低。
MySQL提供了按需使用的方式,通過 query_cache_type 參數來設置是否開啟查詢緩存。(注意:MySQL 8.0 版本直接將查詢緩存功能去掉了)
query_cache_type 參數值選項:
DEMAND對于默認的SQL語句都不使用查詢緩存。
SQL_CACHE對于確定要使用查詢緩存的語句顯示指定。如下命令
mysql> select SQL_CACHE * from T where ID=10;
分析器
分析器對客戶端提交過來的SQL語句進行解析。
首先,進行 詞法分析。對語句字符串進行拆解,識別出數據庫保留關鍵字、表、列 等。
其次,對詞法分析的的結果做 語法分析。語法分析器根據語法規則,判斷輸入的SQL是否滿足MySQL語法。如果SQL語句不對,則會收到“語法錯誤”提醒。
優化器
通過分析器,MySQL就知道要干什么了。 但是在執行之前,需要經過優化器的處理。
優化器的處理范疇:
在表里有多個索引的時候,決定使用哪個索引;
在一個關聯查詢語句中,決定各個表的連接順序 等。
優化器的作用——決定使用哪種方案進行查詢。
優化器如何選擇索引,是否會選錯索引 等問題 后續講解。
執行器
MySQL通過【分析器】知道了要干什么,通過【優化器】知道了該怎么做,于是執行階段開始執行語句。
分析器——知道要干什么
優化器——知道該怎么做
執行器——執行語句
執行器在執行語句時,需要做權限檢查,有權限則打開表繼續執行,打開表時,執行器根據表的引擎定義,去選擇該引擎提供的接口。
在數據庫的慢查詢日志中,有一個 rows_examined 字段,表示這個語句執行過程中掃描了多少行,該值在執行器每次調用引擎獲取數據行的時候進行累加。
在有的場景下,執行器調用一次,在引擎內部則掃描了多行,因此——引擎掃描行數 與 rows_examined并不完全相同。
四、小結
MySQL邏輯架構簡述,通過一個SQL的完整執行流程的各個階段有一個初步印象。
五、思考題
如果表T中沒有字段K,而執行如下語句,則會報“不存在這個列”的錯誤,這個錯誤是在上面提到的哪個階段報出來的呢?
select * from T where k=1;
解答:分析器。Oracle會在分析階段判斷語句是否正確,表是否存在,列是否存在等,MySQL也這樣。
六、評論區筆記與問題
筆記1
1,連接
連接管理模塊,接收請求;連接進程和用戶模塊,通過,連接線程和客戶端對接
2,查詢
查詢緩存 Query Cache
分析器,內建解析樹,對其語法檢查,先from,再on,再join,再where…;檢查權限,生成新的解析樹,語義檢查(沒有字段k在這里)等
優化器,將前面解析樹轉換成執行計劃,并進行評估最優
執行器,獲取鎖,打開表,通過meta數據,獲取數據
3,返回結果
返回給連接進程和用戶模塊,然后清理,重新等待新的請求。
筆記2
1、mysql主要組成部分:連接器,分析器,優化器,執行器,存儲引擎。
2、連接器:驗證賬號密碼,維持鏈接,超時自動斷開,鏈接過程復雜,建議使用長鏈接,連接比較占用內存,需要定時斷開,5.7之后可以使用mysql_reset_connection。
3、分析器:驗證語法的合規性,把sql轉換成mysql內部識別的語句,表明轉換成對應的id。
4、優化器:判斷sql內部的執行順序。
5、執行器:驗證操作庫表是否有權限,調存儲引擎接口查詢數據。
6、慢查詢日志rows_examined,記錄查詢的時候掃描了多少行,相同表有肯能次數不同。
問題1
1、客戶端連接MySQL時,有時候會突然斷開,然后又自動恢復的情況,修改 connection_timeout參數?
connection_timeout 指的是“連接過程中”的等待時間;
wait_timeout 指的是“連接完成后,使用過程中”的等待時間。
問題2
1.MySQL的框架有幾個組件, 各是什么作用?
2.Server層和存儲引擎層各是什么作用?
3.you have an error in your SQL syntax 這個保存是在詞法分析里還是在語法分析里報錯?
4.對于表的操作權限驗證在哪里進行?
5.執行器的執行查詢語句的流程是什么樣的?
本文由博客一文多發平臺 OpenWrite 發布!
總結
以上是生活随笔為你收集整理的mysql直连1.执行语句_MySQL随笔01_一条SQL语句是如何执行的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 中的脏读与幻读_一文带你理解
- 下一篇: jdbc mysql 字符集_JDBC对