關於MySQL的compound-statementSQL

丁奇發表於2016-03-24

背景

       將多個語句發給MySQL,可以減少網路互動次數。對於帶事務的情況,可以縮短單執行緒上事務的生存期。

     將業務邏輯寫成儲存過程是一種形式,但是考慮到這樣等於是將業務邏輯繫結在服務端,不是最佳選擇。

有同學提到希望MySQL能夠支援類似Oraclecompound-statement SQL ,實際上MySQL5.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%,其原因是減少網路互動次數。

       在多執行緒壓力下,效能是否提升則取決於各執行緒事務間的互斥關係。效能提升的得益點在於單個執行緒事務生存期縮短。


相關文章