mysql準備語句(prepared statements), 使用增強的二進位制客戶端/伺服器協議在客戶端和伺服器之間高效的傳送資料,可以通過支援這種行協議的程式設計庫來訪問準備語句。
建立準備語句時,客戶端庫會像伺服器傳送乙個實際查詢的原型,然後伺服器對該原型進行解析和處理,將部分優化過的原型儲存起來,並且給客戶端返回乙個狀態控制代碼(state handle) 客戶端可以通過定義狀態控制代碼重複的執行查詢。
準備語句會比多次執行查詢效率高很多,具體原因如下:
1、伺服器只需要解析一次查詢,這節約了解析和其他開銷
2、因為伺服器快取了一部分執行計畫,所以它只需要執行某些優化步驟一次。
3、通過二進位制傳送引數比通過ascii碼要快的多,比如,通過二進位制傳送date型別的引數只需要3位元組,但通過ascii碼傳送需要10個位元組。解決的效 果對於blob和text型別最為顯著。因為他們可以成塊的傳送。而不是乙個個的傳送。二進位制協議也幫客戶端節約了記憶體,同時減少了網路開銷和資料從本身 的型別轉換為非二進位制協議的開銷。只有準備語句能使用二進位制協議,使用普通的msyql_query()函式提交查詢不會使用二進位制協議。
4、整個查詢不會被傳送到伺服器。只有引數才會被傳送,減少了網路流量。
5、mysql直接吧引數儲存在伺服器的緩衝區內,不需要在記憶體中到處拷貝資料。
6、語句對於安全性也有好處,它不需要在應用程式中對值進行轉移和加引號。這更加方便,並且減少了sql遭受注入***和其他***的可能(永遠也不能信任使用者的輸入,即使使用準備語句也不能)。
準備語句的侷限:
1、準備語句只針對乙個連線,所以另外的連線不能使用同樣的控制代碼,處於同樣的原因,乙個先斷開再重新連線的客戶端會丟失控制代碼(連線池活持續連線會減輕這個問題)
2、準備語句不能使用mysql5.0以前的版本快取
3、使用準備語句並不總是高效,如果只使用一次準備語句,那麼準備它花費的時間可能比執行一次平常的sql語句更長,準備語句也需要在伺服器和客戶端之間進行額外的資訊互動。
4、.如果忘記銷毀準備語句,那麼就有可能引起資源洩露,這會消耗相當多的伺服器資源,同樣,因為對儲存語句的數量有乙個全域性性的限制,所以乙個錯誤可能會干擾其他使用準備語句的連線。
MySQL筆記(MYSQL準備語句)
mysql準備語句 mysql支援準備語句,即在執行真正的查詢前,將查詢的模式先傳送到伺服器進行解析,將解析和優化的結果儲存下來,在一些程式設計庫中支援這種功能,通過準備語句可以很高效的在客戶端和伺服器端進行資料傳送。準備語句中,將?作為引數,例如 insert into people last n...
MySQL筆記(MYSQL準備語句)
mysql準備語句 mysql支援準備語句,即在執行真正的查詢前,將查詢的模式先傳送到伺服器進行解析,將解析和優化的結果儲存下來,在一些程式設計庫中支援這種功能,通過準備語句可以很高效的在客戶端和伺服器端進行資料傳送。準備語句中,將?作為引數,例如 insert into people last n...
MySQL準備語句
mysql準備語句 prepared statements 使用增強的二進位制客戶端 伺服器協議在客戶端和伺服器之間高效的傳送資料,可以通過支援這種行協議的程式設計庫來訪問準備語句。建立準備語句時,客戶端庫會像伺服器傳送乙個實際查詢的原型,然後伺服器對該原型進行解析和處理,將部分優化過的原型儲存起來...