一、数据集成任务切分键探索
对于数据集成任务,这些任务的时间消耗一般都主要花费在数据同步上,当查询表数据量较大时,其SQL本身在数据库中查询就是很慢的,那么对于这种情况有说明好的优化方法呢?
数据集成任务上提供了一个切分键的设置,那么该切分键是否可以对源库SQL查询有一定的提升,进而提高数据同步任务的整体效率呢?
切分键:可以将源数据表中某一列作为切分键
建议使用主键或有索引的列作为切分键
1、如何探究任务究竟怎么入库查询拉取数据呢?
这里主要讲案例中使用到的MySQL数据库时可以通过什么方案探究任务如何入库查询,我们可以打开MySQL的general_log,general log记录连接到数据库的所有操作。值得注意的一点是,开启开操作对数据库性能有极大影响,所以一般情况下我们仅仅会在分析问题的时候才会在自己测试环境开启该日志。
general_log参数默认关闭,若我们需要开启,可在数据库中动态设置。general_log_file指定路径即为日志路径,可在操作系统中tail -100f ${general_log_file}实时查看日志记录情况。
mysql> show variables like '%general%';
+------------------+--------------------------------------------+
| Variable_name | Value |
+------------------+--------------------------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/izt4niarmwaooao2egw7wiz.log |
+------------------+--------------------------------------------+
2 rows in set (0.01 sec)
mysql> set global general_log=on;
Query OK, 0 rows affected (0.11 sec)
mysql> show variables like '%general%';
+------------------+--------------------------------------------+
| Variable_name | Value |
+------------------+--------------------------------------------+
| general_log | ON |
| general_log_file | /var/lib/mysql/izt4niarmwaooao2egw7wiz.log |
+------------------+--------------------------------------------+
2 rows in set (0.01 sec)
2、不设置切分键时,SQL如何执行?
直接使用元SQL入库查询
select xxx,xxx from `shardkey`
3、设置切分键时,SQL如何执行?
1、查询切分键的最大最小值范围
SELECT MIN(id),MAX(id) FROM `shardkey`
2、根据切分键范围进行切分,范围割接左闭右开,max值时左闭右闭,除范围查询外增加切分键is null的查询,避免遗漏数据
1)根据min/max进行范围切分
select xxx,xxx from `shardkey` where (1 <= id AND id < 19923)
select xxx,xxx from `shardkey` where (19923 <= id AND id < 39845)
...
...
select xxx,xxx from `shardkey` where (179299 <= id AND id <= 199221)
2)查询切分键 is null的情况
select xxx,xxx from `shardkey` where id IS NULL
3、按照最大并发数进行并发查询(实际并发数<=任务最大期望并发数)
在任务执行时可通过在数据库执行show processlist进行监控查看
当任务最大期望并发数为2时:
当任务最大期望并发数为4时:
4、切分键使用注意
1、推荐使用主键作为切分键,因为为表主键通常情况下比较均匀,因此切分出来的分片也不容易出现数据热点
2、目前splitPk仅支持整型数据切分,不支持字符串、浮点、日期等其他类型。
二、切分键使用性能测试
数据源信息设置
数据源使用rds for mysql,配置信息如下:
数据源接入,使用阿里云实例模式接入
测试表为shardkey,并向表内插入11407872行记录。
CREATE TABLE `shardkey` (
`id` int(40) NOT NULL AUTO_INCREMENT,
`ref_data_id` int(40) NOT NULL,
`ref_meta_id` int(40) NOT NULL,
`ref_attribute_id` int(40) NOT NULL,
`value` text NOT NULL,
`creator` varchar(40) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`tenant` varchar(40) DEFAULT NULL,
`model` varchar(40) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11602312 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
mysql>select count(*) from shardkey;
+--------------------+
| count(*) |
+--------------------+
| 11407872 |
+--------------------+
返回行数:[1],耗时:15684 ms.
方案一:不设置切分键,默认最大并发数为2
数据集成任务配置如下:
Reader: mysql
column=[["id","ref_data_id","ref_meta_id","ref_attribute_id","value","creator","create_time","update_time","tenant","model"]]
connection=[[{"datasource":"rds_for_mysql","table":["`shardkey`"]