亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

概述

今天主要分享下MySQL的SQL預(yù)處理方面內(nèi)容,也是屬于優(yōu)化必須會(huì)的一方面,建議大家都能掌握。


一、SQL 語句的執(zhí)行處理

1、即時(shí) SQL

一條 SQL 在 DB 接收到最終執(zhí)行完畢返回,大致的過程如下:

精心總結(jié)的MySQL數(shù)據(jù)庫的SQL預(yù)處理技術(shù),優(yōu)化數(shù)據(jù)庫必備

 

  • 1. 詞法和語義解析;
  • 2. 優(yōu)化 SQL 語句,制定執(zhí)行計(jì)劃;
  • 3. 執(zhí)行并返回結(jié)果;

如上,一條 SQL 直接是走流程處理,一次編譯,單次運(yùn)行,此類普通語句被稱作 Immediate Statements (即時(shí) SQL)。

2、預(yù)處理 SQL

但是,絕大多數(shù)情況下,某需求某一條 SQL 語句可能會(huì)被反復(fù)調(diào)用執(zhí)行,或者每次執(zhí)行的時(shí)候只有個(gè)別的值不同(比如 select 的 where 子句值不同,update 的 set 子句值不同,insert 的 values 值不同)。如果每次都需要經(jīng)過上面的詞法語義解析、語句優(yōu)化、制定執(zhí)行計(jì)劃等,則效率就明顯不行了。

所謂預(yù)編譯語句就是將此類 SQL 語句中的值用占位符替代,可以視為將 SQL 語句模板化或者說參數(shù)化,一般稱這類語句叫Prepared Statements。

預(yù)編譯語句的優(yōu)勢(shì)在于歸納為:一次編譯、多次運(yùn)行,省去了解析優(yōu)化等過程;此外預(yù)編譯語句能防止 SQL 注入。

注意:

雖然可能是通過預(yù)處理 SQL 的方式一定程度的提高了效率,但是對(duì)于優(yōu)化而言,最優(yōu)的執(zhí)行計(jì)劃不是光靠 SQL 語句的模板化來實(shí)現(xiàn)的,往往還是需要通過具體值來預(yù)估出成本代價(jià)。


二、Prepared SQL Statement Syntax

MySQL 官方將 prepare、execute、deallocate 統(tǒng)稱為 PREPARE STATEMENT。翻譯也就習(xí)慣的稱其為預(yù)處理語句。

MySQL 預(yù)處理語句的支持版本較早,所以我們目前普遍使用的 MySQL 版本都是支持這一語法的。

語法

# 定義預(yù)處理語句
PREPARE stmt_name FROM preparable_stmt;
# 執(zhí)行預(yù)處理語句
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
# 刪除(釋放)定義
{DEALLOCATE | DROP} PREPARE stmt_name;

1、利用字符串定義預(yù)處理 SQL (直角三角形計(jì)算)

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hwb';
mysql> SET @a = 3;
mysql> SET @b = 4; 
mysql> EXECUTE stmt1 USING @a, @b;
mysql> DEALLOCATE PREPARE stmt1; 
精心總結(jié)的MySQL數(shù)據(jù)庫的SQL預(yù)處理技術(shù),優(yōu)化數(shù)據(jù)庫必備

 

2、利用變量定義預(yù)處理 SQL (直角三角形計(jì)算)

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hwb';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @c = 6;
mysql> SET @d = 8;
mysql> EXECUTE stmt2 USING @c, @d;
mysql> DEALLOCATE PREPARE stmt2;
精心總結(jié)的MySQL數(shù)據(jù)庫的SQL預(yù)處理技術(shù),優(yōu)化數(shù)據(jù)庫必備

 

3、解決無法傳參問題

我們知道,對(duì)于 LIMIT 子句中的值,必須是常量,不得使用變量,也就是說不能使用:SELECT * FROM TABLE LIMIT @skip, @numrows; 如此,這里就可以用 PREPARE 語句解決此問題。

mysql> SET @skip = 1; 
mysql> SET @numrows = 3;
mysql> SELECT host,user FROM mysql.user LIMIT @skip, @numrows;
mysql> PREPARE stmt3 FROM "SELECT host,user FROM mysql.user LIMIT ?, ?";
mysql> EXECUTE stmt3 USING @skip, @numrows;
mysql> DEALLOCATE PREPARE stmt3;
精心總結(jié)的MySQL數(shù)據(jù)庫的SQL預(yù)處理技術(shù),優(yōu)化數(shù)據(jù)庫必備

 

如此一來,結(jié)合2中介紹的利用變量定義預(yù)處理 SQL 也就基本解決了傳參時(shí)語法報(bào)錯(cuò)問題了,類似的:用變量傳參做表名時(shí),MySQL 會(huì)把變量名當(dāng)做表名,這樣既不是本意,也會(huì)是語法錯(cuò)誤,在 SQL Server 的解決辦法是利用字符串拼接穿插變量進(jìn)行傳參,再將整條 SQL 語句作為變量,最后是用 sp_executesql 調(diào)用該拼接 SQL 執(zhí)行,而 Prepared SQL Statement 可謂異曲同工之妙。

mysql> SET @table = 'mysql.user';
mysql> SET @s = CONCAT('SELECT HOST,USER FROM ', @table);
mysql> PREPARE stmt4 FROM @s;
mysql> EXECUTE stmt4;
mysql> DROP PREPARE stmt4;
精心總結(jié)的MySQL數(shù)據(jù)庫的SQL預(yù)處理技術(shù),優(yōu)化數(shù)據(jù)庫必備

 

 


三、預(yù)處理 SQL 使用注意點(diǎn)

1、stmt_name 作為 preparable_stmt 的接收者,唯一標(biāo)識(shí),不區(qū)分大小寫。

2、preparable_stmt 語句中的 ? 是個(gè)占位符,所代表的是一個(gè)字符串,不需要將 ? 用引號(hào)包含起來。

3、定義一個(gè)已存在的 stmt_name ,原有的將被立即釋放,類似于變量的重新賦值。

4、PREPARE stmt_name 的作用域是session級(jí)

精心總結(jié)的MySQL數(shù)據(jù)庫的SQL預(yù)處理技術(shù),優(yōu)化數(shù)據(jù)庫必備

 

可以通過 max_prepared_stmt_count 變量來控制全局最大的存儲(chǔ)的預(yù)處理語句。

mysql> show variables like 'max_prepared%';
精心總結(jié)的MySQL數(shù)據(jù)庫的SQL預(yù)處理技術(shù),優(yōu)化數(shù)據(jù)庫必備

 


最后,預(yù)處理編譯 SQL 是占用資源的,所以在使用后注意及時(shí)使用 DEALLOCATE PREPARE 釋放資源,這也是一個(gè)好習(xí)慣。

分享到:
標(biāo)簽:預(yù)處理 SQL
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績?cè)u(píng)定