一條sql的執(zhí)行流程
- 客戶端連接Mysql,連接器負責連接管理和權限認證坯台。
- 連接之后會將查詢緩存中炬丸,如果緩存命中了,再檢查時候有訪問的權限蜒蕾,如果有稠炬,則返回數(shù)據(jù)集,否則執(zhí)行3咪啡。
- 分析器負責對sql語句先解析語句首启,再檢查語句是否正確,交于優(yōu)化器撤摸。
- 優(yōu)化器負責索引的選擇和多表連接時選擇查詢順序毅桃,之后交于執(zhí)行器。
- 執(zhí)行器首先判斷時候有權限訪問表准夷,如果有的話執(zhí)行器就根據(jù)表的定義的引擎去調用引擎接口钥飞,再接收數(shù)據(jù)集。
- 返回數(shù)據(jù)集給客戶端衫嵌。
查詢緩存好嗎读宙?
查詢緩存中的好嗎?是不是要開啟查詢緩存呢楔绞?其實不建議開啟查詢緩存结闸,原因是緩存失效非常頻繁,只要表更新了酒朵,緩存就會失效桦锄。所以對于那些更新操作多的表來說簡直是災難,除非是靜態(tài)表蔫耽,所以在mysql8中已經(jīng)將查詢緩存取消了结耀。
Mysql中的長鏈接和短連接,長連接會導致什么問題针肥?
- 長連接是指饼记,當客戶端連接數(shù)據(jù)庫之后香伴,如果持續(xù)訪問數(shù)據(jù)庫慰枕,將保持連接。
- 短連接是指即纲,當客戶端連接數(shù)據(jù)庫之后具帮,在很少的幾次操作之后就會斷開連接。
那是不是長連接就一定好呢?其實不是的蜂厅,在長連接中匪凡,會產(chǎn)生大量的內(nèi)存使用,這些內(nèi)存會保存在連接對象中掘猿,所以長連接會導致內(nèi)存漲的很快病游,會到值OOM,表現(xiàn)的就是mysql異常重啟稠通,那怎么解決呢衬衬?我們可以適時地將長連接斷開,這樣內(nèi)存就可以回收了改橘,還有一個辦法就是重置連接對象滋尉,利用mysql_reset_connection命令,這樣就不用重連數(shù)據(jù)庫了飞主,只是恢復連接對象到剛連接的狀態(tài)狮惜。
為什么查詢權限要在執(zhí)行階段?
這是因為sql操作涉及的表不一定只有sql語句中的那些碌识,要在執(zhí)行器階段才能確認碾篡。
問題:
如果表 T 中沒有字段 k,而你執(zhí)行了這個語句 select * from T
where k=1, 那肯定是會報“不存在這個列”的錯誤: “Unknown column ‘k’ in
‘where clause’”筏餐。你覺得這個錯誤是在我們上面提到的哪個階段報出來的呢耽梅?
答:分析器階段,在分析器階段解析器會解析sql語句生成一顆解析樹胖烛,判斷表時候存在眼姐,列字段是否存在等。