欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

一條更新的SQL語句是如何執行的

林子帆2年前13瀏覽0評論

一條更新的SQL語句是如何執行的?

第一步:連接器

首先你需要連接到數據庫上,你會輸入ip,端口,賬號密碼。然后根據你的賬號密碼,連接器就來驗證你的身份了。

兩種情況:1.用戶密碼不對,你就被Access denied了。

2.驗證通過,連接器就去權限表獲取這個賬戶下面的權限用于這個連接之后的權限判斷。

第二種情況的意思就是,如果這個連接還保持著,如果管理員更改了你賬戶的權限,不會影響你的賬戶。只有斷開了連接再重新連接才會有影響。而且這個連接如果你連你之后一直沒啥操作,連接器就會自動斷開連接,默認時間是8小時。

這里有一點要注意:你的所有操作的臨時內存都會保存在你這個連接里面,只有在斷開連接之后才會釋放這些內存。所以如果長時間保持連接,并且有大內存的操作導致占用內存太多了,Mysql就會被系統重啟了。

所以如果有大內存操作最好重連一下釋放臨時內存!如果你Mysql版本是5.7或者以上的,可以通過執行mysql_reset_connection來釋放臨時內存。

第二步:查緩存

連接好之后如果你執行查詢語句就會先去緩存看看,如果之前執行過這條語句的話,會以鍵值對的形式保存在緩存中,key就是查詢語句,value就是結果,能直接返回。

聽起來好像很好,緩存了之后很舒服,但是往往利用緩存弊大于利!怎么說?

比如你對一個表查了10條語句,好了都緩存了,如果這個表的一個update語句進來,完了。之前所有緩存都會被清空!白忙了!除非是靜態表,基本上不會有更新的那種,可以用緩存!

注意8.0版本直接把緩存咔了,沒這個功能了。

第三步:分析器

如果緩存沒中,好了就來到了分析器了,先分析下詞法,例如"select"這樣的關鍵字還有你的表名,列名提取出來,然后再語法分析,判斷你的語句是否滿足語法,如果不對那就給你個"You have an error in your SQL syntax" 是不是常見?

第四步:優化器

分析了之后其實Mysql已經知道你要干嘛了,但是它還是要幫你優化一下!比如決定用哪個索引啊?怎么個順序連接表啊等。

舉個例子 "select * from a join b on a.id = b.id where a.t=10 and b.e=20;"

第一種情況,先從表a中找出t=10的值,再根據這些id關聯表b,再判斷e是否等于20。

第二種情況,先從表b中找出e=20的值,再根據這些id關聯表a,再判斷t是否等于10。

這兩種結果肯定都是一樣的,但是根據表a和表b的數據執行效率是不一樣的,由優化器來預估決定到底用哪種方案!優化器就是干這事的!

第五步:執行器

到這步就來執行了!執行時候來看看你有沒有這個權限,有的話就繼續執行,沒的話你懂得,就是command denied了!

按照上面那個語句,如果用了第一種情況,那執行流程就是:

通過存儲引擎的接口調用引擎返回表的第一行,看看t是不是10,如果是則存入結果集,如果不是則跳過。

繼續調接口取第二行直到遍歷完,

然后返回結果集給客戶端。

可能會有人覺得奇怪,為什么在第五步的時候才驗證權限?為什么不在優化器之前做?

因為在有時SQL語句操作的不僅僅是SQL字面上這些的,比如你搞了個觸發器,觸發器只有在執行的時候才能確認,所以驗證權限這步得在執行器做,之前的做不了。

一條語句在Mysql的執行就這樣大功告成了!