DistSQL 实用技巧系列:如何批量执行 DistSQL

背景

DistSQL 是 ShardingSphere 提供的管理语言,能够帮助用户减少对配置文件的编辑操作,并且通过 DistSQL 管理资源和规则,所有的变更都是实时生效的,无需重启 Proxy。

提问

在使用 ShardingSphere-Proxy 的过程中,若需创建逻辑数据库,要输入 CREATE DATABASE 语句。
现在用户有一个压测场景,需要创建 1000 个逻辑数据库,有哪些办法可以提高效率呢?

回答

办法有多种:

1. 通过 JDBC 接口编程,在程序中批量执行 SQL 命令:

/**
* 省略模板代码
*/
public void createDatabase() throws SQLException {
    try (Statement statement = connection.createStatement()) {
         for(int i=0; i< 1000; i++){
    	     String sql = String.format("CREATE DATABASE IF NOT EXISTS test_db_%s", i);
             statement.executeUpdate(sql);
         }
    }
}

2. 使用 Bash 脚本,通过 MySQL 终端批量执行 SQL:

前提: 需要本机能够执行 mysql 命令

  • 创建脚本文件 createDB.sh
	#!/bin/bash
	
	PROXY="mysql -uroot -proot -h127.0.0.1 -P3307"
	
	for i in {0..1000}
	do
	        ${PROXY} -e "CREATE DATABASE IF NOT EXISTS test_db_${i};"
	done
  • 执行创建好的 createDB.sh 文件
	sh ./createDB.sh

END

以上就是本次分享的实用技巧,欢迎大家参与讨论,提出更多更好的 idea,感谢阅读!

转载请注明来自 SphereEx 中文论坛 https://community.sphere-ex.com/

2 个赞

楼主, 话说 DistSQL 可以出一个批量执行的命令吗? :crazy_face:

这是一个有趣的提议,想要如何使用,能举个例子吗?

能否考虑让用户使用 inline 表达式, 比如: CREATE DATABASE IF NOT EXISTS test_db_$->{0…1000}

我从两个角度来分析:
1、如果应用系统确实需要经常做类似的操作(创建大量 databases),那么在使用 ShardingSphere 之前,这个需求也是存在的,压测人员或者 DBA 应该是有可用的脚本的,类似之前提供的两种方案。
2、ShardingSphere 保持了对原生语法的兼容,还没有自定义 DDL、DML 语句的先例。

所以,如果您有这样的需要,我的建议是自行进行扩展,DistSQL 小组也可以提供帮助支持。当更多的用户有了共性的需求之后,我们再考虑将它贡献到 master 分支。

好的, 多谢答疑.

1 个赞
京ICP备2021015875号