我想运行一些测试来比较我们的 mysql 应用程序在几种配置中的性能。但我不想使用 sysbench 或 oltp 测试之类的东西,因为我们有一些繁重的存储过程逻辑。所以...我想针对我们的程序进行测试。
是否有任何测试应用程序/框架可用于运行自定义查询(作为选项 - 并行)并查看统计数据?类似网络版 Siege 的东西?我已经发现的通常使用他们自己生成的数据库模式和场景。
我可以要求我的开发人员创建一些自定义的 Java 接口并使用 Siege,但不想增加开销或影响数字。
问候,伊戈尔。
答案1
Jmeter可以使用JDBC进行数据库负载测试:http://jakarta.apache.org/jmeter/usermanual/build-db-test-plan.html
我之前没有使用过 jdbc 功能,所以我不知道它是否可以处理您的复杂查询。
答案2
您可以遵循大多数单元测试引擎的一般原则来构建一个简单的 mySQL 单元测试引擎。
我们过去曾为 MS SQL 构建过类似的产品
这个想法如下
1) 我们编写单元测试程序并赋予它们相同的名称前缀,如“test_”。在 MS SQL 中,我们还使用扩展属性作为元信息来描述测试的一些特定参数(与在 NUnit 中可以使用不同的测试属性相同)
2) 我们编写一个过程/脚本,打开一个游标,从目录中选择所有以“test_”开头的过程名称,并在 EXEC (@procedure_name) 语句中执行每个过程。如果测试失败,测试过程应引发错误。
3)测试执行的结果存储在表中。
4)为了对相同数据进行测试并获得可预测的结果,我们有一个示例测试数据库,我们备份了一次,并在每次测试执行之前从备份中恢复
答案3
如果你想要一个现在随 MySQL 5.1 打包的工具,你可以尝试一下MySQL Slap(又名 mysqlslap). 文档中的一个例子:
提供您自己的创建和查询 SQL 语句,其中 50 个客户端查询,每个客户端 200 个选择:
mysqlslap --delimiter=";" \ --create="CREATE TABLE a (b int);INSERT INTO a VALUES (23)" \ --query="SELECT * FROM a" --concurrency=50 --iterations=200
这提供了并行运行测试的选项 - 尽管使用多个客户端实现并行可能并不完全符合您的喜好。以下是简要说明(再次逐字逐句):
mysqlslap 运行分为三个阶段:
创建架构、表以及(可选)您想要用于测试的任何存储程序或数据。此阶段使用单个客户端连接。
运行负载测试。此阶段可以使用许多客户端连接。
清理(断开连接,如果指定则删除表)。此阶段使用单个客户端连接。
如果这不完全符合您的口味,您可以使用 cron 脚本在特定时间为许多用户触发 MySQL Slap,或者为许多具有相同配置/规格的机器(具有相同的服务器网络路径等)触发 MySQL Slap(后者非常重要,因为基准测试应该消除任何可能的差异,以防止得出模糊的结论)。
如果(很可能)您正在运行以前的 MySQL 版本,此链接提供了有关如何将 5.1 源代码编译为 5.0 的有用信息;进一步的反向移植可能是不可能实现的。
答案4
我最终使用了SQL输入输出 给磁盘施加压力,然后编写了一些自定义查询来生成大量数据,然后在大型表上进行各种计算,并模拟负载很重但优化不佳的数据库。然后我增加了并发连接数,直到它死掉。