背景
将多個語句發給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%,其原因是減少網絡互動次數。
在多線程壓力下,性能是否提升則取決于各線程事務間的互斥關系。性能提升的得益點在于單個線程事務生存期縮短。