Mysql:一条sql是如何执行的?
生活随笔
收集整理的這篇文章主要介紹了
Mysql:一条sql是如何执行的?
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- mysql的邏輯架構(gòu)
- sql語(yǔ)句各關(guān)鍵字執(zhí)行順序圖
mysql的邏輯架構(gòu)
根據(jù)mysql的邏輯架構(gòu)圖,我們可以看出Mysql可以分為Server層和存儲(chǔ)引擎層兩部分。
Server層:Server層包括連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器等,涵蓋了Mysql中的大多數(shù)核心服務(wù)功能,以及所有的內(nèi)置函數(shù)(如日期、時(shí)間、數(shù)學(xué)、加密函數(shù)等),所有跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn),比如存儲(chǔ)過(guò)程、觸發(fā)器、視圖等。
存儲(chǔ)引擎層:存儲(chǔ)引擎層負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和提取。器架構(gòu)模式是插件式的,支持InnoDB、MyISAM、Memory等多個(gè)存儲(chǔ)引擎?,F(xiàn)在最常用的存儲(chǔ)引擎是InnoDB,它從MySQL5.5版本開始就成為了默認(rèn)存儲(chǔ)引擎。例如需要指定存儲(chǔ)引擎可以在create table的時(shí)候使用engine=memory來(lái)指定內(nèi)存引擎創(chuàng)建表。
需要注意的是在連接中盡量避免長(zhǎng)連接,因?yàn)镸ysql在執(zhí)行過(guò)程中臨時(shí)使用的內(nèi)存是管理在連接對(duì)象里面的,如果長(zhǎng)連接累積下來(lái)可能導(dǎo)致內(nèi)存占用太大,被系統(tǒng)強(qiáng)行殺掉(OOM),從現(xiàn)象看就是Mysql異常重啟了。
可以考慮兩種方案解決:
1.定期斷開長(zhǎng)連接。使用一段時(shí)間,或者程序判斷執(zhí)行過(guò)一個(gè)占用內(nèi)存的大查詢后,斷開連接,之后查詢?cè)僦剡B。
2.如果使用的是Mysql5.7或者更新版本,可以在每次執(zhí)行一個(gè)比較大的操作后,通過(guò)執(zhí)行mysql_reset_connection來(lái)重新初始化連接資源。這個(gè)過(guò)程不需要重連和重新做權(quán)限驗(yàn)證,但是會(huì)將連接恢復(fù)到剛剛創(chuàng)建完時(shí)的狀態(tài)。
但是大多數(shù)形況下,建議不要使用查詢緩存,因?yàn)椴樵兙彺嫱状笥诶?br /> 查詢緩存的失效非常頻繁,只要有對(duì)一個(gè)表的更新,這個(gè)表上所有的查詢緩存都會(huì)被清空。因此很可能查詢緩存還沒有使用就一個(gè)更新全清空了。對(duì)于更新壓力大的數(shù)據(jù)庫(kù)來(lái)說(shuō),查詢緩存的命中率會(huì)非常低。但是如果你使用的時(shí)配置表,也就是很長(zhǎng)時(shí)間才會(huì)更新一次的表,那這張表上的查詢才適合使用查詢緩存。
Mysq可以設(shè)置參數(shù)query_cache_type為DEMAND就可以不使用查詢緩存了,這樣默認(rèn)的sql語(yǔ)句就不使用查詢緩存了。如果確定要使用查詢緩存的語(yǔ)句可以使用SQL_CACHE顯示指定,例如下面:
注意:MYSQL8.0版本直接將查詢緩存的整塊功能刪掉了,8.0徹底沒有這個(gè)功能了。
sql語(yǔ)句各關(guān)鍵字執(zhí)行順序圖
總結(jié)
以上是生活随笔為你收集整理的Mysql:一条sql是如何执行的?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天学一点儿shell:xargs 命令
- 下一篇: mysql创建数据库并且指定utf-8编