MySQL Prepared語句的具體使用
在數(shù)據(jù)庫應(yīng)用中,很多SQL語句都會重復(fù)執(zhí)行很多次,每次執(zhí)行可能只是where條件中的變量值不同,但MySQL依然會解析SQL語法并生成執(zhí)行計劃。對于這類情況,可以利用prepared語句來避免重復(fù)解析SQL的開銷。
一、prepared語句優(yōu)點
prepared語句通過準(zhǔn)備一個SQL執(zhí)行對象,然后通過execute語句來重復(fù)進行執(zhí)行,在每次執(zhí)行的過程中提供變量的實際值。相比于重復(fù)執(zhí)行SQL語句,prepared statement具有如下優(yōu)勢:
- 在execute語句重復(fù)執(zhí)行的過程中,每次只有傳入的變量值不同,SQL的執(zhí)行計劃不會改變,避免重復(fù)解析SQL。
- 避免SQL注入攻擊。
二、prepare語句用法
prepare statement主要有3個組成部分:
- prepare語句:生成一個prepared statement對象并為其指定別名,可使用占位符?指定變量。
- execute語句:通過別名執(zhí)行一個prepared statement,可通過using子句為變量提供值。
- deallocate prepared語句:通過別名釋放一個prepared statement。
Prepare語句的生效范圍是會話,MySQL使用參數(shù)max_prepared_stmt_count來控制語句的最大數(shù)量,如果將該參數(shù)設(shè)置為0,將會禁用prepared statement功能。
show variables like 'max_prepared_stmt_count';
執(zhí)行如下SQL準(zhǔn)備示例數(shù)據(jù):
create table person( id int auto_increment primary key, name varchar(32)); insert into person values (null, 'Vincent'), (null, 'Victor'), (null, 'Grace'); select * from person;
2.1 prepare語句
prepare語句根據(jù)文本生成一個SQL語句對象,并為其指定一個別名,在準(zhǔn)備過程中,可以使用占位符?來替代變量:
set @sql = 'select name from person where id=?'; prepare stmt from @sql;
示例中通過變量名來傳入SQL文本,也可以直接通過SQL文本prepare,例如:prepare stmt from ‘select name from person where id=?’;
prepare語句還有一個較常用的場景為動態(tài)SQL拼接。即根據(jù)用戶選擇的條件來快速調(diào)整過濾條件拼接出不同的SQL:
set @base = 'select * from person where 1=1'; set @id_filter = ' and id=?'; set @name_filter = ' and name=?'; set @sql2 = concat(@base, @id_filter, @name_filter); -- 選擇了條件,就加入拼接 prepare stmt2 from @sql2;
2.2 execute語句
執(zhí)行完prepare語句后,即可用execute語句來執(zhí)行,如果有?代替的變量,則需要通過using語句為其指定值(數(shù)量要和prepare語句中?數(shù)量相同)。execute語句在每次執(zhí)行提供不同的變量,即可實現(xiàn)一次解析,多次執(zhí)行:
set @var1 = 1; execute stmt using @var1; set @var2 = 2; execute stmt using @var2;
注意using子句中只能通過變量來提供值,如果通過常量提供值,則會報錯:
execute stmt using 1;
2.3 deallocate prepare語句
prepare語句使用完成后可以使用deallocate/drop prepare ….語句手動進行釋放,另外當(dāng)會話斷開時,所有未釋放的prepare語句也會自動釋放,因此重連或者異常中斷都會導(dǎo)致prepare statement丟失。
deallocate prepare stmt;
到此這篇關(guān)于MySQL Prepared語句的具體使用的文章就介紹到這了,更多相關(guān)MySQL Prepared語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用beautifulsoup4爬取酷狗音樂代碼實例
這篇文章主要介紹了python使用beautifulsoup4爬取酷狗音樂代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12Python實現(xiàn)監(jiān)控鍵盤鼠標(biāo)操作示例【基于pyHook與pythoncom模塊】
這篇文章主要介紹了Python實現(xiàn)監(jiān)控鍵盤鼠標(biāo)操作,結(jié)合實例形式分析了Python基于pyHook與pythoncom模塊的鍵盤、鼠標(biāo)事件響應(yīng)及日志文件操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-09-09解決pip?install報錯:Cannot?connect?to?proxy問題
這篇文章主要介紹了解決pip?install報錯:Cannot?connect?to?proxy問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05Python3 把一個列表按指定數(shù)目分成多個列表的方式
今天小編就為大家分享一篇Python3 把一個列表按指定數(shù)目分成多個列表的方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12OpenCV3.3+Python3.6實現(xiàn)圖片高斯模糊
這篇文章主要為大家詳細(xì)介紹了OpenCV3.3+Python3.6實現(xiàn)圖片高斯模糊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-05-05