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

所属分类: 数据库 / Mysql 阅读数: 236
收藏 0 赞 0 分享

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

创建表:

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

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

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 ; 

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

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随机数据生成并插入

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。效率大幅提高,但不知道还可不可以进一步优化。

更多精彩内容其他人还在看

mysql数据表的基本操作之表结构操作,字段操作实例分析

这篇文章主要介绍了mysql数据表的基本操作之表结构操作,字段操作,结合实例形式分析了mysql表结构操作,字段操作常见增删改查实现技巧与操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql学习笔记之完整的select语句用法实例详解

这篇文章主要介绍了mysql学习笔记之完整的select语句用法,结合实例形式详细分析了mysql select语句各种常见参数、使用方法及操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL5.6 GTID模式下同步复制报错不能跳过的解决方法

搭建虚拟机centos6.0, mysql5.6.10主从复制,死活不同步,搞了一整天找到这篇文章终于OK了,特分享一下,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL开启慢查询方法及实例

这篇文章主要介绍了MySQL开启慢查询方法及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

简单了解MYSQL数据库优化阶段

这篇文章主要介绍了简单了解MYSQL数据库优化阶段,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Windows下MySQL主从复制的配置方法

MySQL主从复制允许将来自一个数据库(主数据库)的数据复制到一个或多个数据库(从数据库),主数据库一般是实时的业务数据写入和更新操作,从数据库常用的读取为主
收藏 0 赞 0 分享

Mysql数据库设计三范式实例解析

这篇文章主要介绍了Mysql数据库设计三范式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql数据类型和字段属性原理与用法详解

这篇文章主要介绍了mysql数据类型和字段属性,结合实例形式分析了mysql数据类型和字段属性基本概念、原理、分类、用法及操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql连接查询、联合查询、子查询原理与用法实例详解

这篇文章主要介绍了mysql连接查询、联合查询、子查询原理与用法,结合实例形式详细分析了mysql连接查询、联合查询、子查询的基本概念、功能、原理、用法及操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Window下如何恢复被删除的Mysql8.0.17 Root账户及密码

这篇文章主要介绍了Window下如何恢复被删除的Mysql8.0.17 Root账户及密码,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多