基础算法
数据库
Javascript
HTML 编程
SVG
附录
在 Keeper 任务调度工具中,任务实例表是访问比较频繁的表,且数据增量较大。为了测试在大数据量的访问效率,特意做了这个实验。这个实验分别测试 MySQL 大表分区和不分区下的常用 3 种查询的速度。关于如何分担大表的负载,可以查看另一篇文章:MySQL 中大数据量高访问量的表负载分担策略。
分为两个表test1
和test2
,其中test1
表不分区,test2
表使用主键id
分区,共分为 10 个区。其中 job_id
为索引。
实验过程中,每 500 万数据测试一下,最大数据量 5000 万数据。假如 Keeper 共有 2000 个调度任务,这 2000 个调度任务每天生成 5000 个实例,如果不使用任务自动清理的话,达到 5000 万数据量需要 1 万天。嗯,足够了。
数据表中 job_id
取 1 ~ 2000 之间的随机数,title
字段为 32 位随机字符,title
字段和create_time
字段与测试基本无关。
两种方案均在工作机上进行测试,16G 内存,6 核 12 线程 CPU,SSD 硬盘。测试过程中尽量不使用电脑,保证不同测试的硬件无差异。
每种方案下共进行三种查询,第一种为按 job_id
进行分组计数,每二种查询为按 job_id
取前 100 条数据,第三种查询为按主键id
查找单条数据。job_id
和id
均按其值范围随机生成对应的数字。每种查询进行 100000 次,最后取均值,最多保留小数点后 3 位,时间单位为毫秒。
数据量 | COUNT 计数 | SELECT 100 | 主键查询 | |||
不分区 | 分区 | 不分区 | 分区 | 不分区 | 分区 | |
500万 | 1.287 | 1.962 | 3.408 | 4.233 | 0.298 | 0.341 |
1000万 | 1.833 | 2.705 | 3.095 | 3.842 | 0.641 | 0.637 |
1500万 | 2.894 | 3.494 | 3.561 | 4.536 | 0.735 | 0.758 |
2000万 | 3.216 | 4.251 | 3.202 | 5.117 | 0.771 | 0.682 |
2500万 | 4.072 | 5.43 | 3.27 | 4.616 | 0.765 | 0.796 |
3000万 | 4.73 | 6.356 | 3.23 | 5.384 | 0.84 | 0.922 |
3500万 | 5.515 | 7.852 | 3.622 | 5.586 | 0.925 | 0.88 |
4000万 | 6.905 | 9.683 | 3.013 | 6.499 | 0.898 | 0.914 |
4500万 | 6.36 | 14.171 | 3.043 | 4.878 | 0.749 | 0.809 |
5000万 | 7.271 | 9.016 | 2.808 | 5.101 | 0.785 | 0.781 |
测试结论分析如下:
7.271ms
可以接受。源代码使用 Scala 编写,其中用到了 Qross PQL 中相关的类。
源代码使用 Scala 编写,其中用到了 Qross PQL 中相关的类。
参考链接