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列,完成citation插入后再删除。这样sql语句就改成了:
String sql = "insert into citation(pId1,pId2) values((select pId from papers where temp=?), (select pId from
papers where temp=?))";
再一次插入10w条数据,耗时38s。效率大幅提高,但不知道还可不可以进一步优化。
相关文档:
今天练习在JSP页面中实现分页效果,在查询语句方面牵扯到了top的用法。简要做一下总结:
为实现类似top的功能,我们在SQL Server中和MySQL中使用到的SQL语句是不同的。
1、在SQL Server中,我们使用 select top N * ......
MySQL启动与基本配置
MySQL是一个小型关系型数据库管理系统。开发者为瑞典MySQLAB公司,在2008年1月16号被Sun公司10亿美元收购。MySQL被广泛地应用在Internet的中小型网站中,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
MySQL ......
引言
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。
设计范式是不是很难懂呢?非也 ......
今天安装mysql遇到很多麻烦,想象原因,自己还是linux的初学者,同时受挫时总是要把问题的复杂系数放大。
1 安装冲突
根据《linux程序设计》上的指导,从官网下载了mysql-server-xx,mysql-devel-xx,mysql-client-xx,mysql-share-xx,然后执行
rpm -i *.rpm
结果二十几行conflict提示,说有文件与mysql-server-xx的安 ......
以下这篇文章论述上在什么情况下子查询比一般的内连接查询更加快速
http://www.mysqlperformanceblog.com/2010/03/18/when-the-subselect-runs-faster/
以下是我对mysql的order by和limit优化的建议,要适表的数据量和用来过滤列的唯一值的个数而定
(1)where子句中用来过滤结果的列所在索引的cadinality很小,即用相关 ......