背景
本文重點(diǎn)講述MySQL中的預(yù)編譯語(yǔ)句并從MySQL的Connector/J源碼出發(fā)講述其在Java語(yǔ)言中相關(guān)使用。
注意:文中的描述與結(jié)論基于MySQL 5.7.16以及Connect/J 5.1.42版本。
預(yù)編譯語(yǔ)句是什么
通常我們的一條sql在db接收到最終執(zhí)行完畢返回可以分為下面三個(gè)過程:
詞法和語(yǔ)義解析
優(yōu)化sql語(yǔ)句,制定執(zhí)行計(jì)劃
執(zhí)行并返回結(jié)果
我們把這種普通語(yǔ)句稱作Immediate Statements。
但是很多情況,我們的一條sql語(yǔ)句可能會(huì)反復(fù)執(zhí)行,或者每次執(zhí)行的時(shí)候只有個(gè)別的值不同(比如query的where子句值不同,update的set子句值不同,insert的values值不同)。
如果每次都需要經(jīng)過上面的詞法語(yǔ)義解析、語(yǔ)句優(yōu)化、制定執(zhí)行計(jì)劃等,則效率就明顯不行了。
所謂預(yù)編譯語(yǔ)句就是將這類語(yǔ)句中的值用占位符替代,可以視為將sql語(yǔ)句模板化或者說參數(shù)化,一般稱這類語(yǔ)句叫Prepared Statements或者Parameterized Statements
預(yù)編譯語(yǔ)句的優(yōu)勢(shì)在于歸納為:一次編譯、多次運(yùn)行,省去了解析優(yōu)化等過程;此外預(yù)編譯語(yǔ)句能防止sql注入。
當(dāng)然就優(yōu)化來(lái)說,很多時(shí)候最優(yōu)的執(zhí)行計(jì)劃不是光靠知道sql語(yǔ)句的模板就能決定了,往往就是需要通過具體值來(lái)預(yù)估出成本代價(jià)。
MySQL服務(wù)端預(yù)編譯
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26