程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 關於MySQL的compound-statement SQL

關於MySQL的compound-statement SQL

編輯:MySQL綜合教程

關於MySQL的compound-statement SQL   背景        將多個語句發給MySQL,可以減少網絡交互次數。對於帶事務的情況,可以縮短單線程上事務的生存期。      將業務邏輯寫成存儲過程是一種形式,但是考慮到這樣等於是將業務邏輯綁定在服務端,不是最佳選擇。 有同學提到希望MySQL能夠支持類似Oracle的compound-statement SQL ,實際上MySQL在5.0就支持啦。   C API        在mysql_real_connect 時連接參數增加CLIENT_MULTI_STATEMENTS就可以用分號隔開,將多個SQL語句一起發給Server。    其實在mysql自帶的客戶端中,連接參數就已經設置了這個位。    mysql_real_connect(&mysql, host, user, password,                           database, opt_mysql_port, opt_mysql_unix_port,                           connect_flag | CLIENT_MULTI_STATEMENTS)   MySQL 客戶端用法        但是即使如此,用戶在客戶端輸入用分號區分的多個SQL語句,其實還是在客戶端拆分以後按順序發送的。        也就是說類似這樣的語句 mysql> insert into test123 values(1,'a');insert into test123 values(2,'a'); 實際上是先執行完成第一個insert,返回結果後再發送第二個。        其原因是mysql客戶端在解析用戶輸入時,會將”;”作為語句終結符。        重定義語句終結符即可。實際上要實現多語句的語法,我們在創建存儲過程時就用過了。   delimiter ;; begin;insert into test123 values(1, 'aaaaa');insert into test123 values(1, 'aaaaa');insert into test123 values(1, 'aaaaa'); commit;;   這樣第二行是整行發給server端。   說明        在單線程測試上述場景壓力下,compound-statement的方式比單線程性能提升約20%,其原因是減少網絡交互次數。        在多線程壓力下,性能是否提升則取決於各線程事務間的互斥關系。性能提升的得益點在於單個線程事務生存期縮短。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved