日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql直连1.执行语句_MySQL随笔01_一条SQL语句是如何执行的

發(fā)布時間:2024/9/30 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql直连1.执行语句_MySQL随笔01_一条SQL语句是如何执行的 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、MySQL基礎架構示意圖

二、MySQL分層

總體來講,MySQL可以分為二層:Server層 和 存儲引擎 兩部分,如下圖所示。

不同的存儲引擎共用一個Server層。

三、各部分組件概述

連接器

負責與客戶端建立連接、獲取權限、維持和管理連接。比如常規(guī)的連接MySQL Server的命令如下

mysql -h$ip -P$port -u$user -p

回車-->輸入密碼

命令中的mysql是客戶端工具,用來與服務端建立連接,通過TCP協(xié)議進行連接。

2.MySQL客戶端 與 Server連接器連接成功后 進行身份認證,若是認證通過,連接器則會到權限表查詢用戶所擁有的權限。

一旦客戶端與Server之間成功建立連接,當前連接將會保持已查詢到的用戶權限,即使是管理員賬號對用戶權限做了修改,也不會影響已經(jīng)存在的連接權限,即新權限對新的連接生效。

連接完成后,若是沒有后續(xù)動作,則連接處于空閑狀態(tài),可以通過 show processlist命令查看連接的狀態(tài)。Command 列即為連接當前所處的狀態(tài)。

客戶端若是長時間沒有使用,連接器會自動斷開連接,可通過參數(shù) wait_timeout 來設置,默認為8小時。

若是客戶端與Server之間的連接 被連接器超時斷開后,客戶端再次發(fā)送請求時,則會收到“丟失連接”錯誤,若是要繼續(xù)操作則需要進行重連。

關于數(shù)據(jù)庫的連接

長連接 指連接成功后,如果客戶端持續(xù)有請求,則一直使用同一個連接。

短連接 指 每次執(zhí)行完很少的幾次查詢就斷開連接,下次查詢再重新創(chuàng)建一個連接。

建立連接通常比較復雜 以及耗費資源,因此,在使用過程中要盡量減少建立連接的動作,即 盡量使用長連接。

關于使用長連接時,有些時候MySQL占用內存增長很快的問題

原因 MySQL在執(zhí)行過程中臨時使用的內存是管理在連接對象里面的,被占用的內存資源 是在連接斷開的時候才釋放。

后果 長連接隨著使用時間不斷累積下來,可能導致內存占用太大,被系統(tǒng)強制殺掉(OOM),從表現(xiàn)上來看就是MySQL異常重啟了。

解決方案

1). 定期斷開長連接。 使用一段時間、或者程序中判斷執(zhí)行過一個占用內存大的查詢后,斷開連接,之后查詢再重連。

2). 如果使用的是MySQL 5.7或更高版本,可以在每次執(zhí)行一個比較大的操作后,通過 mysql_reset_connection 來重新初始化連接資源(釋放連接所占用的內存資源)。

這個重置連接的操作,不需要重連和重新做權限驗證,但是可以將連接恢復到新創(chuàng)建完連接時的狀態(tài)。

查詢緩存

在客戶端與MySQL Server建立連接后,就可以進行DML等操作了。

MySQL中,對于之前執(zhí)行過的語句及其結果 可能會以key-value 對的形式被直接緩存在內存中,key為查詢語句,value是查詢結果。

MySQL收到查詢請求時,會先到查詢緩存查找:

若命中緩存key,則直接返回value結果給客戶端,MySQL不需要繼續(xù)執(zhí)行后面的操作——效率高;

若語句不在查詢緩存中,則會執(zhí)行后面的各執(zhí)行階段。執(zhí)行完成后,執(zhí)行結果被保存到查詢緩存中。

大多數(shù)情況下不建議使用查詢緩存——>>查詢緩存的使用 往往 弊大于利。

為什么?——查詢緩存的失效非常頻繁,只要有對一個表有更新,則這個表上的所有查詢緩存都會被清空。 對于更新頻繁的數(shù)據(jù)庫來說,查詢緩存的命中率非常低。

MySQL提供了按需使用的方式,通過 query_cache_type 參數(shù)來設置是否開啟查詢緩存。(注意:MySQL 8.0 版本直接將查詢緩存功能去掉了)

query_cache_type 參數(shù)值選項:

DEMAND對于默認的SQL語句都不使用查詢緩存。

SQL_CACHE對于確定要使用查詢緩存的語句顯示指定。如下命令

mysql> select SQL_CACHE * from T where ID=10;

分析器

分析器對客戶端提交過來的SQL語句進行解析。

首先,進行 詞法分析。對語句字符串進行拆解,識別出數(shù)據(jù)庫保留關鍵字、表、列 等。

其次,對詞法分析的的結果做 語法分析。語法分析器根據(jù)語法規(guī)則,判斷輸入的SQL是否滿足MySQL語法。如果SQL語句不對,則會收到“語法錯誤”提醒。

優(yōu)化器

通過分析器,MySQL就知道要干什么了。 但是在執(zhí)行之前,需要經(jīng)過優(yōu)化器的處理。

優(yōu)化器的處理范疇:

在表里有多個索引的時候,決定使用哪個索引;

在一個關聯(lián)查詢語句中,決定各個表的連接順序 等。

優(yōu)化器的作用——決定使用哪種方案進行查詢。

優(yōu)化器如何選擇索引,是否會選錯索引 等問題 后續(xù)講解。

執(zhí)行器

MySQL通過【分析器】知道了要干什么,通過【優(yōu)化器】知道了該怎么做,于是執(zhí)行階段開始執(zhí)行語句。

分析器——知道要干什么

優(yōu)化器——知道該怎么做

執(zhí)行器——執(zhí)行語句

執(zhí)行器在執(zhí)行語句時,需要做權限檢查,有權限則打開表繼續(xù)執(zhí)行,打開表時,執(zhí)行器根據(jù)表的引擎定義,去選擇該引擎提供的接口。

在數(shù)據(jù)庫的慢查詢日志中,有一個 rows_examined 字段,表示這個語句執(zhí)行過程中掃描了多少行,該值在執(zhí)行器每次調用引擎獲取數(shù)據(jù)行的時候進行累加。

在有的場景下,執(zhí)行器調用一次,在引擎內部則掃描了多行,因此——引擎掃描行數(shù) 與 rows_examined并不完全相同。

四、小結

MySQL邏輯架構簡述,通過一個SQL的完整執(zhí)行流程的各個階段有一個初步印象。

五、思考題

如果表T中沒有字段K,而執(zhí)行如下語句,則會報“不存在這個列”的錯誤,這個錯誤是在上面提到的哪個階段報出來的呢?

select * from T where k=1;

解答:分析器。Oracle會在分析階段判斷語句是否正確,表是否存在,列是否存在等,MySQL也這樣。

六、評論區(qū)筆記與問題

筆記1

1,連接

連接管理模塊,接收請求;連接進程和用戶模塊,通過,連接線程和客戶端對接

2,查詢

查詢緩存 Query Cache

分析器,內建解析樹,對其語法檢查,先from,再on,再join,再where…;檢查權限,生成新的解析樹,語義檢查(沒有字段k在這里)等

優(yōu)化器,將前面解析樹轉換成執(zhí)行計劃,并進行評估最優(yōu)

執(zhí)行器,獲取鎖,打開表,通過meta數(shù)據(jù),獲取數(shù)據(jù)

3,返回結果

返回給連接進程和用戶模塊,然后清理,重新等待新的請求。

筆記2

1、mysql主要組成部分:連接器,分析器,優(yōu)化器,執(zhí)行器,存儲引擎。

2、連接器:驗證賬號密碼,維持鏈接,超時自動斷開,鏈接過程復雜,建議使用長鏈接,連接比較占用內存,需要定時斷開,5.7之后可以使用mysql_reset_connection。

3、分析器:驗證語法的合規(guī)性,把sql轉換成mysql內部識別的語句,表明轉換成對應的id。

4、優(yōu)化器:判斷sql內部的執(zhí)行順序。

5、執(zhí)行器:驗證操作庫表是否有權限,調存儲引擎接口查詢數(shù)據(jù)。

6、慢查詢日志rows_examined,記錄查詢的時候掃描了多少行,相同表有肯能次數(shù)不同。

問題1

1、客戶端連接MySQL時,有時候會突然斷開,然后又自動恢復的情況,修改 connection_timeout參數(shù)?

connection_timeout 指的是“連接過程中”的等待時間;

wait_timeout 指的是“連接完成后,使用過程中”的等待時間。

問題2

1.MySQL的框架有幾個組件, 各是什么作用?

2.Server層和存儲引擎層各是什么作用?

3.you have an error in your SQL syntax 這個保存是在詞法分析里還是在語法分析里報錯?

4.對于表的操作權限驗證在哪里進行?

5.執(zhí)行器的執(zhí)行查詢語句的流程是什么樣的?

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!

總結

以上是生活随笔為你收集整理的mysql直连1.执行语句_MySQL随笔01_一条SQL语句是如何执行的的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。