1. 程式人生 > >13. mysql 預處理

13. mysql 預處理

mysql 提供的API 操作資料庫時,我們選用預處理方式即mysql_stmt_* 系列函式。為什麼選用預處理語句,而不直接用mysql_query 進行查詢呢? 

下面說下預處理語句的優缺點: 

        Mysql4.1 及更高版本支援伺服器端的準備語句(prepared statements) ,它使用增強的二進位制客戶端/ 伺服器協議在客戶端和伺服器端之間高校的傳送資料。 

        建立預處理語句時,客戶端會向伺服器傳送一個實際查詢的原型,然後伺服器對該原型進行解析和處理,將部分優化過的原型儲存起來,並且給客戶端返回一個狀態控制代碼。客戶端可以通過定義狀態控制代碼重複的執行查詢。 

        預處理語句可以有引數,它用問號(?) 代表執行時的具體引數。接下來可以把狀態控制代碼和每個問號對應的值傳送到伺服器執行查詢。這個過程可以重複任意次。

優點:使用預處理語句會比多次執行查詢效率高的多

1. 伺服器只需要解析一次查詢,這節約瞭解析和其他的開銷 。

2. 因為伺服器快取了一部分執行計劃,所以它只需要執行某些優化步驟一次 。

3. 通過二進位制傳送引數比通過ASCII碼要快的多。比如,通過二進位制傳送DATE 型別的引數只需要3 個位元組,但通過ASCII 碼傳送要10 個位元組。節約的效果對於BLOB 和TEXT 型別最為顯著,因為它們可以成塊的傳送,而不是一個個的傳送。二進位制協議也幫助客戶端節約了記憶體,同時減少了網路開銷和資料從本身的型別轉換為非二進位制協議的開銷。 

4. 整個查詢不會被髮送到伺服器,只有引數才會被髮送,這減少了網路流量。 

5. Mysql 直接把引數儲存在伺服器的緩衝區內,不需要在記憶體中到處copy 資料。 

6. 預處理語句對安全性也有好處,它不需要在應用程式中對值進行轉義和加引號,這更加方便,並且減少了遭SQL 注入攻擊的可能性。

缺點:預處理語句也有一些侷限:

1. 預處理語句只針對一個連線,所以另外的連線不能使用同樣的控制代碼。出於這個原因,一個先斷開再從新連線的客戶端會丟失控制代碼。 

2. 預處理語句不能使用mysql5.0以前版本的快取。 

3. 使用預處理語句並不總是高效的。如果只使用一次預處理語句,那麼準備它花費的時間可能比執行一次平常的sql 語句更長。 

4.  如果忘記銷燬預處理語句,那麼就有可能引起資源洩漏。