sql查詢語句性能優(yōu)化技巧 一條更新的SQL語句是如何執(zhí)行的?
一條更新的SQL語句是如何執(zhí)行的?第一步:連接器首先,您需要連接到數(shù)據(jù)庫,并輸入ip、端口和帳戶密碼。然后根據(jù)你的賬號(hào)密碼,連接器會(huì)驗(yàn)證你的身份。有兩種情況:1。如果用戶密碼不正確,您將被拒絕訪問。2
一條更新的SQL語句是如何執(zhí)行的?
第一步:連接器
首先,您需要連接到數(shù)據(jù)庫,并輸入ip、端口和帳戶密碼。然后根據(jù)你的賬號(hào)密碼,連接器會(huì)驗(yàn)證你的身份。
有兩種情況:1。如果用戶密碼不正確,您將被拒絕訪問。
2.驗(yàn)證通過后,連接器到權(quán)限表獲取該賬戶下的權(quán)限,用于本次連接后的權(quán)限判斷。
第二種情況是指,如果這個(gè)連接仍然保持,如果管理員更改了你的帳戶的權(quán)限,也不會(huì)影響你的帳戶。只有斷開連接再重新連接才有意義。此外,如果你還沒有 如果此后沒有對(duì)此連接做任何事情,連接器將自動(dòng)斷開連接,默認(rèn)時(shí)間是8小時(shí)。
這里要注意一點(diǎn):你所有操作的臨時(shí)記憶都會(huì)存儲(chǔ)在你的連接中,只有斷開后才會(huì)釋放。所以如果長時(shí)間保持連接,大內(nèi)存的操作占用內(nèi)存太多,Mysql就會(huì)被系統(tǒng)重啟。
所以如果有大內(nèi)存操作,最好重新連接,釋放臨時(shí)內(nèi)存!如果你的Mysql版本是5.7以上,可以通過執(zhí)行mysql_reset_connection來釋放臨時(shí)內(nèi)存。
第二步:檢查緩存。
連接之后,如果執(zhí)行一個(gè)查詢語句,會(huì)先去緩存。如果您以前執(zhí)行過該語句,它將以鍵值對(duì)的形式存儲(chǔ)在緩存中。key是查詢語句,value是結(jié)果,可以直接返回。
聽起來不錯(cuò),而且。;緩存后非常舒服,但是經(jīng)常使用緩存弊大于利!你說什么?
例如,如果您在一個(gè)表中查找10條語句,它們都會(huì)被緩存。如果這個(gè)表的update語句進(jìn)來,它 結(jié)束了。之前所有緩存都會(huì)清空!答案是零!除非是靜態(tài)表,基本沒有更新,可以用緩存!
注意8.0版本直接屏蔽了緩存,這個(gè)功能沒有了。
第三步:分析器
如果緩存失敗,它將會(huì)出現(xiàn)在解析器中。首先分析詞法,比如select和你的表名、列名等關(guān)鍵字,然后分析語法,確定你的語句是否符合語法。如果不是,通常會(huì)給你一個(gè)你的SQL語法有錯(cuò)誤?
第四步:優(yōu)化程序
經(jīng)過分析,Mysql其實(shí)是知道你想要什么的,但是還是要幫你優(yōu)化!比如決定用哪個(gè)指數(shù)?如何按順序連接表格?
例如,select * from a join b on wh:。
通過存儲(chǔ)引擎的接口調(diào)用引擎返回表的第一行,看t是否為10。如果是,它將被存儲(chǔ)在結(jié)果集中,否則將被跳過。
繼續(xù)調(diào)用接口獲取第二行,直到遍歷完成。
然后將結(jié)果集返回給客戶端。
有些人可能想知道為什么在第五步中驗(yàn)證權(quán)限。為什么不在優(yōu)化器之前做呢?
因?yàn)橛袝r(shí)候SQL語句操作的不僅僅是字面上的SQL,比如你有一個(gè)觸發(fā)器,這個(gè)觸發(fā)器只有在執(zhí)行的時(shí)候才能被確認(rèn),所以驗(yàn)證權(quán)限這一步就得由執(zhí)行人來做,前面的可以 還沒完。
Mysql中一條語句的執(zhí)行就這樣完成了!
sql語句查詢速度是1分鐘慢嗎?
可以優(yōu)化。我們最近在做的就是用三臺(tái)30G內(nèi)存12核的虛擬機(jī)。對(duì)于6.14億條數(shù)據(jù)(Mysql中130G,parquet格式中30G),多字段分組聚合一個(gè)字段計(jì)數(shù)(distinct)大約需要30秒,而普通查詢大約需要2秒。所以我覺得你的情況還有很大的優(yōu)化空間。