關於MySQL的compound-statementSQL
背景
將多個語句發給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%,其原因是減少網路互動次數。
在多執行緒壓力下,效能是否提升則取決於各執行緒事務間的互斥關係。效能提升的得益點在於單個執行緒事務生存期縮短。
相關文章
- 關於MySQLMySql
- 關於mysql的優化MySql優化
- mysql關於mysql.server的總結MySqlServer
- 關於mysql的query_cacheMySql
- 面試關於 MySQL 的編寫面試MySql
- Mysql 關於event的詳解MySql
- 關於mysql的最佳化MySql
- mysql關於variable的總結MySql
- 關於MySQL使用的時長MySql
- 關於MYSQL flush table的作用MySql
- 【Mysql】關於mysql存入emoji表情的問題MySql
- mysql~關於mysql分割槽表的測試MySql
- 關於SHELL+MYSQLMySql
- 關於SUNONE+MYSQLNoneMySql
- 關於 MySQL 的巢狀事務MySql巢狀
- Mysql關於procedure、function的詳解MySqlFunction
- 關於mysql連線慢的分析.MySql
- 關於mysql連線的問題MySql
- MySQL 關於毫秒的處理薦MySql
- mysql 關於exists 和in分析MySql
- 【mysql】關於binlog格式MySql
- MySQL:關於ICP特性的說明(未完)MySql
- 《關於MySQL的一些騷操作》MySql
- mysql關於臨時表的總結MySql
- 關於Mysql索引的資料結構MySql索引資料結構
- mysql關於mysqld_safe的總結MySql
- mysql關於表空間的總結MySql
- mysql關於ibdata檔案的理解MySql
- 關於mysql5.6 的排序問題.MySql排序
- 關於MySQL的一些小見解MySql
- 關於mysql 1067的錯誤MySql
- 關於MySQL event的一些整理MySql
- 【MySQL】關於 unauthenticated user的哲學思考MySql
- mysql關於memory引擎的表的總結MySql
- 【Mysql】關於一個mysql的坑比時區問題MySql
- MySQL 關於Table cache設定MySql
- 【轉】關於MySQL許可權MySql
- 關於mysql許可權管理MySql