1. 程式人生 > >MySQL預處理語句深入分析

MySQL預處理語句深入分析

MySQL預處理語句 1:概述 1:MySQL客戶端/伺服器協議提供了預處理語句。該功能採用了由mysql_stmt_init()初始化函式返回的MYSQL_STMT語句處理程式資料結構。對於多次執行的語句,預處理執行是一種有效的方式。首先對語句進行解析,為執行作好準備。接下來,在以後使用初始化函式返回的語句控制代碼執行一次或多次。 2:Mysql4.1 及更高版本支援伺服器端的準備語句(prepared statements) ,它使用增強的二進位制客戶端/ 伺服器協議在客戶端和伺服器端之間高校的傳送資料。          3:建立預處理語句時,客戶端會向伺服器傳送一個實際查詢的原型,然後伺服器對該原型進行解析和處理,將部分優化過的原型儲存起來,並且給客戶端返回一個狀態控制代碼。客戶端可以通過定義狀態控制代碼重複的執行查詢。         4:  預處理語句可以有引數,它用問號(?) 代表執行時的具體引數。接下來可以把狀態控制代碼和每個問號對應的值傳送到伺服器執行查詢。這個過程可以重複任意次。 2:常用操作
1:建立預處理語句 prepare stmt_name from 'select * from t_copy where id>?'; 2:設定一個全域性的變數 set @ i=5; 3:執行stmt_name預處理語句 execute stmt_name using @i;
4:刪除預處理 drop prepare stmt_name 3:預處理的優缺點 優點 1: 伺服器只需要解析一次查詢,這節約瞭解析和其他的開銷 2:因為伺服器快取了一部分執行計劃,所以它只需要執行某些優化步驟一次 3:通過二進位制傳送引數比通過ASCII 碼要快的多。比如,通過二進位制傳送DATE 型別的引數只需要3個位元組,但通過ASCII 碼傳送要10 個位元組。節約的效果對於BLOB 和TEXT 型別最為顯著,因為它們可以成塊的傳送,而不是一個個的傳送。二進位制協議也幫助客戶端節約了記憶體,同時減少了網路開銷和資料從本身的型別轉換為非二進位制協議的開銷。
4: 整個查詢不會被髮送到伺服器,只有引數才會被髮送,這減少了網路流量。 5: Mysql 直接把引數儲存在伺服器的緩衝區內,不需要在記憶體中到處copy 資料 6.:預處理語句對安全性也有好處,它不需要在應用程式中對值進行轉義和加引號,這更加方便,並且減少了遭SQL 注入攻擊的可能性缺點 1:預處理語句只針對一個連線,所以另外的連線不能使用同樣的控制代碼。出於這個原因,一個先斷開再從新連線的客戶端會丟失控制代碼。 2:預處理語句不能使用mysql5.0 以前版本的快取 3:使用預處理語句並不總是高效的。如果只使用一次預處理語句,那麼準備它花費的時間可能比執行一次平常的sql 語句更長。 4:如果忘記銷燬預處理語句,那麼就有可能引起資源洩漏。