加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Mysql入门mysql 如何插入随机字符串数据的实现方法

发布时间:2020-12-12 00:53:02 所属栏目:MySql教程 来源:网络整理
导读:《Mysql入门mysql 如何插入随机字符串数据的实现方法》要点: 本文介绍了Mysql入门mysql 如何插入随机字符串数据的实现方法,希望对您有用。如果有疑问,可以联系我们。 MYSQL教程 应用场景: 有时需要测试插入数据库的记录来测试,所以就非常需要用到这些脚

《Mysql入门mysql 如何插入随机字符串数据的实现方法》要点:
本文介绍了Mysql入门mysql 如何插入随机字符串数据的实现方法,希望对您有用。如果有疑问,可以联系我们。

MYSQL教程应用场景:
有时需要测试插入数据库的记录来测试,所以就非常需要用到这些脚本.

MYSQL教程创建表:

MYSQL教程
CREATE TABLE `tables_a` (
  `id` int(10) NOT NULL DEFAULT '0',`name` char(50) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

MYSQL教程创建产生随机字符串的函数:

MYSQL教程
set global log_bin_trust_function_creators = 1;
DROP FUNCTION IF EXISTS rand_string;
DELIMITER //
CREATE FUNCTION rand_string(n INT)
RETURNS VARCHAR(255)
BEGIN
        DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        DECLARE return_str varchar(255) DEFAULT '';
        DECLARE i INT DEFAULT 0;
        WHILE i < n DO
                SET return_str = concat(return_str,substring(chars_str,FLOOR(1 + RAND()*62 ),1));
                SET i = i +1;
        END WHILE;
        RETURN return_str;
END //
delimiter ; 

MYSQL教程创建插入表的procedure,x是从多少开始.y是多少结束,z是产生多少位随机数

MYSQL教程
delimiter // 
create procedure test(x int(10),y int(10),z int(10))
begin
  DECLARE i INT DEFAULT x;
  while i<y do
 insert into tables_a values(i,rand_string(z));
 set i=i+1;
 end whi

MYSQL教程mysql随机数据生成并插入

MYSQL教程dblp数据库中引用信息很少,平均一篇论文引用0.2篇.使用dblp做实验数据集的某篇论文提到,可以随机添加引用信息.受此启发,我打算为每一篇论文都添加20篇随机引用,于是就写出了如下的sql语句:

MYSQL教程String sql = "insert into citation(pId1,pId2) values( (select pId from papers limit ?,1),(select pId from papers limit ?,1))";

MYSQL教程使用preparedstatement,以batch方式提交数据库.

MYSQL教程第一个参数是paper的rowid信息,从0~N(N为papers的total row).第二个参数是Java生成的20个不重复的随机数,范围是0-N.然后嵌套在for循环里,每1w条数据提交给数据库一次.

MYSQL教程这段代码巧妙运用limit的特性完成随机选tuple,本来是暗暗得意的.自以为把所有的select都交给数据库去做了,省去了通过jdbc的多次连接,应该是很快就可以运行完成的.哪知,插了不过10w条(10000*10)数据,就耗时22分钟之多.最终的实验需要插入400w条数据,也就是说要花14h左右.

MYSQL教程于是开始反思,不断做写类似的程序查找时间瓶颈,最终锁定在select limit,这个操作极耗时间.当初选用limit,原因在于:随机生成的是数字,要把数字映射到tuple,也就是对应到rowid;由于papers表的主键并非递增int,所以默认的rowid不存在.后来一想,可以在papers表上先增加一个auto_increment的temp列,完成citation插入后再删除.这样sql语句就改成了:

MYSQL教程String sql = "insert into citation(pId1,pId2) values((select pId from papers where temp=?),(select pId from papers where temp=?))";

MYSQL教程再一次插入10w条数据,耗时38s.效率大幅提高,但不知道还可不可以进一步优化.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读