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