性能测试报告

测试结果概述

  • 性能损耗测试:服务器资源充足、并发数相同,比较JDBC和Sharding-JDBC性能损耗,Sharding-JDBC相对JDBC损耗不超过7%。
  • 性能对比测试:服务器资源使用到极限,相同的场景JDBC与Sharding-JDBC的吞吐量相当。
  • 性能对比测试:服务器资源使用到极限,Sharding-JDBC采用分库分表后,Sharding-JDBC吞吐量较JDBC不分表有接近2倍的提升。
  • 性能对比测试:服务器资源使用到极限,Sharding-JDBC V1.5.2与V1.4.2对比,性能比较稳定。

基准测试性能对比

业务场景JDBCSharding-JDBC1.5.2Sharding-JDBC1.5.2/JDBC损耗
单库单表查询4934704.7%
单库单表更新668263035.7%
单库单表插入685563757%

JDBC单库两表与Sharding-JDBC两库各两表对比

业务场景JDBC单库两表Sharding-JDBC两库各两表性能提升至
查询17363331192%
更新917017997196%
插入1157423043199%

JDBC单库单表与Sharding-JDBC两库各一表对比

业务场景JDBC单库单表Sharding-JDBC两库各一表性能提升至
查询15862944185%
更新954818561194%
插入1118221414192%

Sharding-JDBC v1.4.2与v1.5.2版本对比

业务场景Sharding-JDBC 1.4.2Sharding-JDBC 1.5.21.5.2 / 1.4.2
查询29342944100.34%
更新1845418561100.58%
插入2104521414101.75%

测试目的

  • 对比Sharding-JDBC 1.5.2与JDBC性能是否有较大损耗;
  • Sharding-JDBC 1.52与1.4.2版本对比,性能是否有损耗;
  • Sharding-JDBC 1.5.2是否存在非功能问题,为优化提供依据;

测试场景

JDBC业务场景

业务场景场景缩写
单库单表查询JSdbStSelect
单库单表插入JSdbStInsert
单库单表更新JSdbStUpdate
单库两表查询JSdbMtSelect
单库两表插入JSdbMtInsert
单库两表更新JSdbMtUpdate

Sharding-JDBC业务场景

业务场景场景缩写
单库单表查询SJSdbStSelect
单库单表插入SJSdbStInsert
单库单表更新SJSdbStUpdate
单库两表查询SJSdbMtSelect
单库两表插入SJSdbMtInsert
单库两表更新SJSdbMtUpdate
两库各一表查询SJMdbStSelect
两库各一表插入SJMdbStInsert
两库各一表更新SJMdbStUpdate
两库各两表查询SJMdbMtSelect
两库各两表插入SJMdbMtInsert
两库各两表更新SJMdbMtUpdate

所有测试场景共分为以下两大类,其中极限测试测试范围是全部场景,基准测试范围是以下场景:

业务场景场景缩写
单库单表查询JSdbStSelect
单库单表插入JSdbStInsert
单库单表更新JSdbStUpdate
单库单表查询SJSdbStSelect
单库单表插入SJSdbStInsert
单库单表更新SJSdbStUpdate

测试方法

基准测试:服务器资源充足,使用同样的并发线程数量,对比同样的业务场景。

极限测试:服务器资源使用达到极限、TPS不再上升,对比JDBC和Sharding-JDBC分库分表。

测试环境配置

服务器配置

名称硬件配置软件配置混合应用
DB0OS:CentOS 6.6 64bit处理器:2C四核内存:32G存储:250G2_RAID1+600G4_RAID10网卡:1000mbpsMySQL 5.7.13
DB1OS:CentOS 6.6 64bit处理器:2C四核内存:32G存储:250G2_RAID1+600G4_RAID10网卡:1000mbpsMySQL 5.7.13

测试过程数据

基准测试

单库单表查询

业务场景业务平均响应时间(ms)业务TPS
JDBC单库单表查询7493
Sharding-JDBC 1.5.2单库单表查询8470

TPS展示

TPS

RT展示

RT

单库单表更新

业务场景业务平均响应时间(ms)业务TPS
JDBC单库单表更新26682
Sharding-JDBC 1.5.2单库单表更新36303

TPS展示

TPS

RT展示

RT

单库单表插入

业务场景业务平均响应时间(ms)业务TPS
JDBC单库单表插入26855
Sharding-JDBC 1.5.2单库单表插入26375

TPS展示

TPS

RT展示

RT

极限测试

单库单表与两库各一表查询

业务场景业务平均响应时间(ms)业务TPS
JDBC单库单表查询71586
Sharding-JDBC 1.5.2单库单表查询71600
Sharding-JDBC 1.5.2两库各1表查询132944

TPS展示

TPS

RT展示

RT

单库两表与两库各两表查询

业务场景业务平均响应时间(ms)业务TPS
JDBC单库两表查询61736
Sharding-JDBC 1.5.2单库两表查询71732
Sharding-JDBC 1.5.2两库各两表查询103331

TPS展示

TPS

RT展示

RT

单库单表更新与两库各一表更新

业务场景业务平均响应时间(ms)业务TPS
JDBC单库单表更新79548
Sharding-JDBC 1.5.2单库单更新79263
Sharding-JDBC 1.5.2两库各1表更新418561

TPS展示

TPS

RT展示

RT

单库两表与两库各2表更新

业务场景业务平均响应时间(ms)业务TPS
JDBC单库两表更新79170
Sharding-JDBC 1.5.2单库两表更新78941
Sharding-JDBC 1.5.2两库各两表更新517997

TPS展示

TPS

RT展示

RT

单库单表插入与两库各一表插入

业务场景业务平均响应时间(ms)业务TPS
JDBC单库单表插入511182
Sharding-JDBC 1.5.2单库单表插入510882
Sharding-JDBC 1.5.2两库各1表插入421414

TPS展示

TPS

RT展示

RT

单库两表与两库各2表插入

业务场景业务平均响应时间(ms)业务TPS
JDBC单库两表插入411574
Sharding-JDBC 1.5.2单库两表插入510849
Sharding-JDBC 1.5.2两库各两表插入423043

TPS展示

TPS

RT展示

RT

Sharding-JDBC 1.4.2与1.5.2两库各一表对比

业务场景Sharding-JDBC 1.4.2Sharding-JDBC 1.5.21.5.2 / 1.4.2
查询29342944100.34%
更新1845418561100.58%
插入2104521414101.75%

TPS展示

TPS

RT展示

RT

附录

本次测试,共使用两台数据库服务器,每台服务器上分别有1库,每个库中分别有2个主表,2个子表。

建表语句说明

主表结构如下:

  1. CREATE TABLE `order0` (
  2. `id` bigint(50) NOT NULL AUTO_INCREMENT,
  3. `order_id` varchar(50) NOT NULL,
  4. `order_type` int(11) DEFAULT NULL,
  5. `cust_id` int(11) DEFAULT NULL,
  6. `cust_type` int(11) DEFAULT NULL,
  7. `cust_email` varchar(50) DEFAULT NULL,
  8. `payment_method_type` int(11) DEFAULT NULL,
  9. `payment_provider_id` int(11) DEFAULT NULL,
  10. `shipping_method_type` int(11) DEFAULT NULL,
  11. `packing_type` int(11) DEFAULT NULL,
  12. `preferred_shipping_time_type` int(11) DEFAULT NULL,
  13. `receiver_name` varchar(100) DEFAULT NULL,
  14. `receiver_address` varchar(200) DEFAULT NULL,
  15. `receiver_country_id` int(11) DEFAULT NULL,
  16. `receiver_province_id` int(11) DEFAULT NULL,
  17. `receiver_city_id` int(11) DEFAULT NULL,
  18. `receiver_zip` varchar(20) DEFAULT NULL,
  19. `receiver_tel` varchar(50) DEFAULT NULL,
  20. `receiver_mobile_tel` varchar(50) DEFAULT NULL,
  21. `cust_message` varchar(500) DEFAULT NULL,
  22. PRIMARY KEY (`id`),
  23. KEY `index_id` (`id`) USING BTREE
  24. ) ENGINE=InnoDB AUTO_INCREMENT=5189307 DEFAULT CHARSET=gbk

子表结构如下:

  1. CREATE TABLE `ordert0` (
  2. `idm` bigint(50) NOT NULL,
  3. `id` int(10) DEFAULT NULL,
  4. `order_idm` varchar(50) DEFAULT NULL,
  5. `order_typem` int(11) DEFAULT NULL,
  6. `cust_idm` int(11) DEFAULT NULL,
  7. `cust_typem` int(11) DEFAULT NULL
  8. ) ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC

SQL语句说明

JDBC 插入

  1. insert
  2. into order?(order_id,order_type,cust_id,cust_type,cust_email,payment_method_type,payment_provider_id,shipping_method_type,packing_type,preferred_shipping_time_type,receiver_name,receiver_address,receiver_country_id,receiver_province_id,receiver_city_id,receiver_zip,receiver_tel,receiver_mobile_tel,cust_message) VALUES (?, 0, 10, 1, 'dtest002@dangdang.com', 1, 6, 1, 0, 3, 'ttt ttt', 'beijingshijinganzhongxin', 9000, 111, 1, '100011', '51236117', ' ', ' ');

JDBC 查询

  1. select a.id,order_id,order_type,cust_id,cust_type,cust_email,payment_method_type,payment_provider_id,shipping_method_type,packing_type,preferred_shipping_time_type,receiver_name,receiver_address,receiver_country_id,receiver_province_id,receiver_city_id,receiver_zip,receiver_tel,receiver_mobile_tel,cust_message from order? a,ordert? b where a.id=? and a.id%100=b.idm%100;

JDBC 更新

  1. Update order? SET order_id=?,order_type=0,cust_id=10,cust_type=1,cust_email='dtest002@dangdang.com' where id=?;

Sharding-JDBC 插入

  1. INSERT INTO `order`(order_id,order_type,cust_id,cust_type,cust_email,payment_method_type,payment_provider_id,shipping_method_type,packing_type,preferred_shipping_time_type,receiver_name,receiver_address,receiver_country_id,receiver_province_id,receiver_city_id,receiver_zip,receiver_tel,receiver_mobile_tel,cust_message) VALUES (?, 0, 10, 1, 'dtest002@dangdang.com', 1, 6, 1, 0, 3, 'ttt ttt', 'beijingshijinganzhongxin', 9000, 111, 1, '100011', '51236117', ' ', ' ');

Sharding-JDBC 查询

  1. select cust_id,cust_type,cust_email,payment_method_type,payment_provider_id,shipping_method_type,packing_type,preferred_shipping_time_type,receiver_name,receiver_address,receiver_country_id,receiver_province_id,receiver_city_id,receiver_zip,receiver_tel,receiver_mobile_tel,cust_message from order a,order_item b where a.id=? and a.id%100=b.idm%100;

Sharding-JDBC 更新

  1. update order SET order_id=?,order_type=0,cust_id=10,cust_type=1,cust_email='dtest002@dangdang.com' where id=?;