MySQL綁定變量詳解


MySQL綁定變量是MySQL中非常重要的一個特性。主要還是通過SQL語句來實現對變量的綁定,綁定變量的SQL語句:INSERT INTO tbl(col1, col2, col3) VALUES (?, ?, ?);。綁定變量的SQL,使用問號標記可以接收參數的位置,當真正需要執行具體查詢的時候,則使用具體值代替這些問號。

當創建一個綁定變量SQL時,客戶端(如C或JAVA等)向服務器發送了一個SQL語句的原型。服務器端收到這個SQL語句的框架后,解析並存儲這個SQL語句的部分執行計划,返回給客戶端一個SQL語句處理句柄。以后每次執行這類查詢,客戶端都制定使用這個句柄。

MySQL在使用綁定變量的時候可以更高效地執行大量重復語句的原因:

1.在服務器端只需要解析一次SQL語句。

2.在服務器端某些優化器的工作只需要執行一次,因為它會緩存一部分的執行計划。

3.以二進制的方式只發送參數和句柄,比起每次發送ASCII碼文本效率更高。不過最大的節省還是來自於BLOB和TEXT字段,綁定變量的形式可以分塊傳輸,而無須一次性傳輸。二進制協議在客戶端也可以節省很多內春,減少了網絡開銷,還節省了將數據從存儲原始格式轉換成文本格式的開銷。

4.僅僅是參數而不是整個查詢語句需要發送到服務器端,所以網絡開銷會更小。

MySQL在存儲參數的時候,直接將其存放到緩存中,不再需要在內存中多次復制。 5.綁定變量相對也更加安全。無須在應用程序中處理轉義,一則更簡單明了,二則也大大減少了SQL注入和攻擊的風險。

綁定變量是會話級別的,所以連接之間不能共用綁定變量句柄。同樣地,一旦連接斷開,則原來的句柄也不能再使用。(連接池和持久化連接可以在一定程度上緩解這個問題)

MySQL5.1之前,綁定變量的SQL是不能使用查詢緩存的。並不是所有的時候使用綁定變量都能獲得更好的性能。如果只是執行一次SQL,那么使用綁定變量的方式五一比直接執行多了一次額外的准備消耗階段,而且還需要一次額外的網絡開銷。(要正確的使用綁定變量,還需要在使用完成之后,釋放相關的資源)

當前版本下,還不能在存儲函數中使用綁定變量,但是在存儲過程中可以使用

如果總是忘記釋放綁定變量資源,則在服務器端很容易發發生資源泄漏。綁定變量SQL總是的限制是一個全局限制,所以某一個其他的錯誤可能會對所有其它的線程都產生影響。

有些操作,如BEGIN,無法在綁定變量中完成。

三種綁定變量類型的部分區別:

1.客戶端模擬的綁定變量:客戶端的驅動程序接收到一個帶參數的SQL,再將指定的值帶入其中,最后將完整的查詢發送到服務器端。

2.服務器端的綁定變量:客戶端使用特殊的二進制協議將帶參數的字符串發送到服務器端,然后使用二進制協議將具體的參數值發送給服務器端執行。

3.SQL接口的綁定變量:客戶端先發送一個帶參數的字符串到服務器端,這類似與使用PREPARE的SQL語句,然后發送設置參數的SQL,最后使用EXECUTE來執行SQL。所有這些都是用普通的文本傳輸協議。

以上就是MySQL綁定變量有關的知識點講解,實際上,作為MySQL的重要高級特性之一,能夠減少硬解析,降低CPU的爭用,節省shared_pool。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM