sql語言中update語句的功能是 一條更新的SQL語句是如何執(zhí)行的?
一條更新的SQL語句是如何執(zhí)行的?第一步:連接器首先你需要連接到數(shù)據(jù)庫上,你會輸入ip,端口,賬號密碼。然后根據(jù)你的賬號密碼,連接器就來驗(yàn)證你的身份了。兩種情況:1.用戶密碼不對,你就被Access
一條更新的SQL語句是如何執(zhí)行的?
第一步:連接器
首先你需要連接到數(shù)據(jù)庫上,你會輸入ip,端口,賬號密碼。然后根據(jù)你的賬號密碼,連接器就來驗(yàn)證你的身份了。
兩種情況:1.用戶密碼不對,你就被Access denied了。
2.驗(yàn)證通過,連接器就去權(quán)限表獲取這個(gè)賬戶下面的權(quán)限用于這個(gè)連接之后的權(quán)限判斷。
第二種情況的意思就是,如果這個(gè)連接還保持著,如果管理員更改了你賬戶的權(quán)限,不會影響你的賬戶。只有斷開了連接再重新連接才會有影響。而且這個(gè)連接如果你連你之后一直沒啥操作,連接器就會自動斷開連接,默認(rèn)時(shí)間是8小時(shí)。
這里有一點(diǎn)要注意:你的所有操作的臨時(shí)內(nèi)存都會保存在你這個(gè)連接里面,只有在斷開連接之后才會釋放這些內(nèi)存。所以如果長時(shí)間保持連接,并且有大內(nèi)存的操作導(dǎo)致占用內(nèi)存太多了,Mysql就會被系統(tǒng)重啟了。
所以如果有大內(nèi)存操作最好重連一下釋放臨時(shí)內(nèi)存!如果你Mysql版本是5.7或者以上的,可以通過執(zhí)行mysql_reset_connection來釋放臨時(shí)內(nèi)存。
第二步:查緩存
連接好之后如果你執(zhí)行查詢語句就會先去緩存看看,如果之前執(zhí)行過這條語句的話,會以鍵值對的形式保存在緩存中,key就是查詢語句,value就是結(jié)果,能直接返回。
聽起來好像很好,緩存了之后很舒服,但是往往利用緩存弊大于利!怎么說?
比如你對一個(gè)表查了10條語句,好了都緩存了,如果這個(gè)表的一個(gè)update語句進(jìn)來,完了。之前所有緩存都會被清空!白忙了!除非是靜態(tài)表,基本上不會有更新的那種,可以用緩存!
注意8.0版本直接把緩存咔了,沒這個(gè)功能了。
第三步:分析器
如果緩存沒中,好了就來到了分析器了,先分析下詞法,例如select這樣的關(guān)鍵字還有你的表名,列名提取出來,然后再語法分析,判斷你的語句是否滿足語法,如果不對那就給你個(gè)You have an error in your SQL syntax 是不是常見?
第四步:優(yōu)化器
分析了之后其實(shí)Mysql已經(jīng)知道你要干嘛了,但是它還是要幫你優(yōu)化一下!比如決定用哪個(gè)索引啊?怎么個(gè)順序連接表啊等。
舉個(gè)例子 select * from a join b on where a.t10 and b.e20
第一種情況,先從表a中找出t10的值,再根據(jù)這些id關(guān)聯(lián)表b,再判斷e是否等于20。
第二種情況,先從表b中找出e20的值,再根據(jù)這些id關(guān)聯(lián)表a,再判斷t是否等于10。
這兩種結(jié)果肯定都是一樣的,但是根據(jù)表a和表b的數(shù)據(jù)執(zhí)行效率是不一樣的,由優(yōu)化器來預(yù)估決定到底用哪種方案!優(yōu)化器就是干這事的!
第五步:執(zhí)行器
到這步就來執(zhí)行了!執(zhí)行時(shí)候來看看你有沒有這個(gè)權(quán)限,有的話就繼續(xù)執(zhí)行,沒的話,就是command denied了!
按照上面那個(gè)語句,如果用了第一種情況,那執(zhí)行流程就是:
通過存儲引擎的接口調(diào)用引擎返回表的第一行,看看t是不是10,如果是則存入結(jié)果集,如果不是則跳過。
繼續(xù)調(diào)接口取第二行直到遍歷完,
然后返回結(jié)果集給客戶端。
可能會有人覺得奇怪,為什么在第五步的時(shí)候才驗(yàn)證權(quán)限?為什么不在優(yōu)化器之前做?
因?yàn)樵谟袝r(shí)SQL語句操作的不僅僅是SQL字面上這些的,比如你搞了個(gè)觸發(fā)器,觸發(fā)器只有在執(zhí)行的時(shí)候才能確認(rèn),所以驗(yàn)證權(quán)限這步得在執(zhí)行器做,之前的做不了。
一條語句在Mysql的執(zhí)行就這樣大功告成了!
update能夠同時(shí)set多個(gè)值嗎?
能。
update能同時(shí)set更新多個(gè)字段值,例如update 表名 set 字段1值1,字段2值2,字段3值3 where id1; update是sql語句的一種,是用來更新數(shù)據(jù)庫記錄的,更新的多個(gè)字段列之間用英文逗號隔開。
更新操作一般要帶where條件,防止誤更新了全表記錄。