Mysql 預處理 PREPARE以及預處理的好處

2022-06-26 06:27:10 字數 3536 閱讀 7964

預製語句的sql語法在以下情況下使用:

· 在編**前,您想要測試預製語句在您的應用程式中執行得如何。或者也許乙個應用程式在執行預製語句時有問題,您想要確定問題是什麼。

· 您想要建立乙個測試案例,該案例描述了您使用預製語句時出現的問題,以便您編制程式錯誤報告。

· 您需要使用預製語句,但是您無法使用支援預製語句的程式設計api。

預製語句的sql語法基於三個sql語句:

prepare stmt_name from preparable_stmt;

execute stmt_name [using @var_name [, @var_name] ...];

prepare stmt_name;

如果帶有此名稱的預製語句已經存在,則在新的語言被預備以前,它會被隱含地解除分配。這意味著,如果新語句包含乙個錯誤並且不能被預備,則會返回乙個錯誤,並且不存在帶有給定名稱語句。

預製語句的範圍是客戶端會話。在此會話內,語句被建立。其它客戶端看不到它。

在預備了乙個語句後,您可使用乙個execute語句(該語句引用了預製語句名稱)來執行它。如果預製語句包含任何引數製造符,則您必須提供乙個列舉了使用者變數(其中包含要與引數結合的值)的using子句。引數值只能有使用者變數提供,using子句必須準確地指明使用者變數。使用者變數的數目與語句中的引數製造符的數量一樣多。

您可以多次執行乙個給定的預製語句,在每次執行前,把不同的變數傳遞給它,或把變數設定為不同的值。

要對乙個預製語句解除分配,需使用deallocate prepare語句。嘗試在解除分配後執行乙個預製語句會導致錯誤。

如果您終止了乙個客戶端會話,同時沒有對以前已預製的語句解除分配,則伺服器會自動解除分配。

以下sql語句可以被用在預製語句中:create table, delete, do, insert, replace, select, set, update和多數的show語句。目前不支援其它語句。

以下例子顯示了預備乙個語句的兩種方法。該語句用於在給定了兩個邊的長度時,計算三角形的斜邊。

第乙個例子顯示如何通過使用文字字串來建立乙個預製語句,以提供語句的文字:

mysql>

prepare stmt1 from

'select sqrt(pow(?,2) + pow(?,2)) as hypotenuse';

mysql

>

set@a=3

;mysql

>

set@b=4

;mysql

>

execute stmt1 using @a, @b;+

------------+

| hypotenuse |+--

----------+|5

|+------------+

mysql>

deallocate

prepare

stmt1;

第二個例子是相似的,不同的是提供了語句的文字,作為乙個使用者變數:

mysql

>

set@s='

select sqrt(pow(?,2) + pow(?,2)) as hypotenuse';

mysql

>

prepare stmt2 from@s;

mysql

>

set@a=6

;mysql

>

set@b=8

;mysql

>

execute stmt2 using @a, @b;+

------------+

| hypotenuse |+--

----------+|10

|+------------+

mysql>

deallocate

prepare stmt2;

預製語句的sql語法不能被用於帶巢狀的風格中。也就是說,被傳遞給prepare的語句本身不能是乙個prepare, execute或deallocate prepare語句。

預製語句的sql語法與使用預製語句api呼叫不同。例如,您不能使用mysql_stmt_prepare() c api函式來預備乙個prepare, execute或deallocate prepare語句。

預製語句的sql語法可以在已儲存的過程中使用,但是不能在已儲存的函式或觸發程式中使用。

1. 首先從mysql伺服器執行sql的過程開始講起,sql執行過程包括以下階段 詞法分析->語法分析->語義分析->執行計畫優化->執行。詞法分析->語法分析這兩個階段我們稱之為硬解析。詞法分析識別sql中每個詞,語法分析解析sql語句是否符合sql語法,並得到一棵語法樹(lex)。對於只是引數不同,其他均相同的sql,它們執行時間不同但硬解析的時間是相同的。而同一sql隨著查詢資料的變化,多次查詢執行時間可能不同,但硬解析的時間是不變的。對於sql執行時間較短,sql硬解析的時間佔總執行時間的比率越高。

2. prepare的出現就是為了優化硬解析的問題。prepare在伺服器端的執行過程如下

2) execute 接收客戶端stmt->id和引數等資訊。注意這裡客戶端不需要再發sql過來。伺服器根據stmt->id在preparestatement cache中查詢得到硬解析後的stmt, 並設定引數,就可以繼續後面的優化和執行了。

1.安全

prepared statements通過sql邏輯與資料的分離來增加安全,sql邏輯與資料的分離能防止普通型別的sql注入攻擊(sql injection attack)。

2.效能

prepared statements只語法分析一次,你初始話prepared statements時,mysql將檢查語法並準備語句的執行,當你執行query 多次時,這樣就不會在有額外的負擔了,如果,當執行query 很多次的時候(如:insert)這種預處理有很大的效能提高

他使用binary protocol協議,這樣更能提高效率。

執行兩條sql查詢:

select

*from a where id>

1select

*from a where id>

10

按執行順序:詞法分析->語法分析->語義分析->執行計畫優化->執行 。執行兩遍。如果使用prepare,節約硬解析時間。那麼同樣執行上面的sql。

prepare first_ prepare from 'select * from a where id>(?)';

其中?可以傳入不同引數。

1. 按執行順序:第一次:詞法分析->語法分析->語義分析->執行計畫優化->執行 。

2. 第二次:語義分析->執行計畫優化->執行 。節約了一次硬解析時間。

> prepare在execute階段可以節省硬解析的時間。如果sql只執行一次,且以prepare的方式執行,那麼sql執行需兩次與伺服器互動(prepare和execute), 而以普通(非prepare)方式,只需要一次互動。這樣使用prepare帶來額外的網路開銷,可能得不償失。我們再來看同一sql執行多次的情況,比如以prepare方式執行10次,那麼只需要一次硬解析。這時候 額外的網路開銷就顯得微乎其微了。因此prepare適用於頻繁執行的sql。

php連線資料庫之預處理 prepare

class connectsqlite function initstatement sql connect new connectsqlite state connect initstatement update users set name newname where name oldname ...

mysql預處理語句 MYSQL 預處理語句

一 預處理語句介紹 mysql支援服務端預處理語句,預處理語句利用高效的客戶端 服務端二進位制協議。用佔位符替換引數值的預處理語句有下列兩個好處 每次執行語句時,解析語句的開銷更小。通常,資料庫應用程式會處理大量相似的語句,只在子句中更改文字或變數值,比如查詢和刪除的where子句,更新的updat...

mysql 預處理 MySQL的預處理技術

所謂的預處理技術,最初也是由mysql提出的一種減輕伺服器壓力的一種技術!傳統mysql處理流程 1,在客戶端準備sql語句 2,傳送sql語句到mysql伺服器 3,在mysql伺服器執行該sql語句 4,伺服器將執行結果返回給客戶端 這樣每條sql語句請求一次,mysql伺服器就要接收並處理一次...