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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

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

一、MySQL基礎(chǔ)架構(gòu)示意圖

二、MySQL分層

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

不同的存儲(chǔ)引擎共用一個(gè)Server層。

三、各部分組件概述

連接器

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

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

回車-->輸入密碼

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

2.MySQL客戶端 與 Server連接器連接成功后 進(jìn)行身份認(rèn)證,若是認(rèn)證通過,連接器則會(huì)到權(quán)限表查詢用戶所擁有的權(quán)限。

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

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

客戶端若是長(zhǎng)時(shí)間沒有使用,連接器會(huì)自動(dòng)斷開連接,可通過參數(shù) wait_timeout 來設(shè)置,默認(rèn)為8小時(shí)。

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

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

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

短連接 指 每次執(zhí)行完很少的幾次查詢就斷開連接,下次查詢?cè)僦匦聞?chuàng)建一個(gè)連接。

建立連接通常比較復(fù)雜 以及耗費(fèi)資源,因此,在使用過程中要盡量減少建立連接的動(dòng)作,即 盡量使用長(zhǎng)連接。

關(guān)于使用長(zhǎng)連接時(shí),有些時(shí)候MySQL占用內(nèi)存增長(zhǎng)很快的問題

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

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

解決方案

1). 定期斷開長(zhǎng)連接。 使用一段時(shí)間、或者程序中判斷執(zhí)行過一個(gè)占用內(nèi)存大的查詢后,斷開連接,之后查詢?cè)僦剡B。

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

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

查詢緩存

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

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

MySQL收到查詢請(qǐng)求時(shí),會(huì)先到查詢緩存查找:

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

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

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

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

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

query_cache_type 參數(shù)值選項(xiàng):

DEMAND對(duì)于默認(rèn)的SQL語句都不使用查詢緩存。

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

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

分析器

分析器對(duì)客戶端提交過來的SQL語句進(jìn)行解析。

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

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

優(yōu)化器

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

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

在表里有多個(gè)索引的時(shí)候,決定使用哪個(gè)索引;

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

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

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

執(zhí)行器

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

分析器——知道要干什么

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

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

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

在數(shù)據(jù)庫的慢查詢?nèi)罩局?#xff0c;有一個(gè) rows_examined 字段,表示這個(gè)語句執(zhí)行過程中掃描了多少行,該值在執(zhí)行器每次調(diào)用引擎獲取數(shù)據(jù)行的時(shí)候進(jìn)行累加。

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

四、小結(jié)

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

五、思考題

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

select * from T where k=1;

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

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

筆記1

1,連接

連接管理模塊,接收請(qǐng)求;連接進(jìn)程和用戶模塊,通過,連接線程和客戶端對(duì)接

2,查詢

查詢緩存 Query Cache

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

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

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

3,返回結(jié)果

返回給連接進(jìn)程和用戶模塊,然后清理,重新等待新的請(qǐng)求。

筆記2

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

2、連接器:驗(yàn)證賬號(hào)密碼,維持鏈接,超時(shí)自動(dòng)斷開,鏈接過程復(fù)雜,建議使用長(zhǎng)鏈接,連接比較占用內(nèi)存,需要定時(shí)斷開,5.7之后可以使用mysql_reset_connection。

3、分析器:驗(yàn)證語法的合規(guī)性,把sql轉(zhuǎn)換成mysql內(nèi)部識(shí)別的語句,表明轉(zhuǎn)換成對(duì)應(yīng)的id。

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

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

6、慢查詢?nèi)罩緍ows_examined,記錄查詢的時(shí)候掃描了多少行,相同表有肯能次數(shù)不同。

問題1

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

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

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

問題2

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

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

3.you have an error in your SQL syntax 這個(gè)保存是在詞法分析里還是在語法分析里報(bào)錯(cuò)?

4.對(duì)于表的操作權(quán)限驗(yàn)證在哪里進(jìn)行?

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

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

總結(jié)

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

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