前言,这几天工作做了个Mysql百万数据表在不同情况下比如子查询数量大小、模拟并发、主键-索引类型、连接方式(in、exists、join)的小测试。过程中无论模拟数据还是测试过程感觉都有很多可以改进的地方。这里记一下我在笔记本上的改进。(PS:工作时模拟了200W数据,开始后就忙别的了。忙完发现自己用的jdbc每条commit,单线程的方式跑的时间以小时记,幸亏没人看见,尴尬死了)
环境:I5-4210U 12G内存 win7 Mysql 5.5.30.
效果:10W数据6s插入
一、线程池+数据库连接池完成数据导入模拟。CountDownLatch确定执行时间。由于笔记本的硬件原因,我决定模拟10W数据的导入。
执行后发现还是好慢,执行时间:5分钟多。
整理代码发现进一步优化的地方,上面的core num是
获得的,于是考虑只设置四个线程来跑。且数据库主键是这样的,也有可能是volatile频繁自旋导致效率下降。考虑在各自线程内维护id。
虽然还是很慢,但有了一定提升。
发现还是太高了。
二、jdbcBatch+线程池。CountDownLatch确定执行时间。
批量数据一定要使用此种方式。10W数据插入降到6s.
相关代码:
1、主逻辑代码:
handler逻辑:
最后抽空模拟了百万数据插入,这里其实是因为我一起Batch了,分组batch性能会进一步提升:
查询性能对比:
结论:尽量不实用join,结果集小,并发度底可以使用in,但尽量表连接使用exists.