mysql随机数据生成并插入
dblp数据库中引用信息很少,平均一篇论文引用0.2篇。使用dblp做实验数据集的某篇论文提到,可以随机添加引用信息。受此启发,我打算为每一篇论文都添加20篇随机引用,于是就写出了如下的sql语句:
String sql = "insert into citation(pId1,pId2) values( (select pId from papers limit ?,1),(select pId from papers
limit ?,1))";
使用preparedstatement,以batch方式提交数据库。
第一个参数是paper的rowid信息,从0~N(N为papers的total row)。第二个参数是java生成的20个不重复的随机数,范围是0-N。然后嵌套在for循环里,每1w条数据提交给数据库一次。
这段代码巧妙运用limit的特性完成随机选tuple,本来是暗暗得意的。自以为把所有的select都交给数据库去做了,省去了通过jdbc的多次连接,应该是很快就可以运行完成的。哪知,插了不过10w条(10000*10)数据,就耗时22分钟之多。最终的实验需要插入400w条数据,也就是说要花14h左右。
于是开始反思,不断做写类似的程序查找时间瓶颈,最终锁定在select limit,这个操作极耗时间。当初选用limit,原因在于:随机生成的是数字,要把数字映射到tuple,也就是对应到rowid;由于papers表的主键并非递增int,所以默认的rowid不存在。后来一想,可以在papers表上先增加一个auto_increment的temp列,

为解决在MySQL中高效插入大量随机引用数据的问题,作者分享了一种利用LIMIT优化SQL语句的方法。最初使用SELECT...LIMIT操作导致长时间运行,后来通过增加临时列并利用其优化查询,将10万条数据插入耗时从22分钟降低到38秒。文章还提及了MySQL的默认值设置、数据库备份策略和安装问题。
最低0.47元/天 解锁文章
2407

被折叠的 条评论
为什么被折叠?



