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;

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

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

(0)

相关推荐

  • 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; 创建产生随机字符串的函数: set global log_bin_trust_function_creators =

  • Mysql快速插入千万条数据的实战教程

    一.创建数据库 二.创建表 1.创建 dept表 CREATE TABLE `dept` ( `id` int(11) NOT NULL, `deptno` mediumint(9) DEFAULT NULL, `dname` varchar(20) DEFAULT NULL, `loc` varchar(13) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 2.创建emp表 CREATE TABLE

  • mysql自动插入百万模拟数据的操作代码

    本人数据库工具用的navicat 其他的大同小异 1.打开navicat,在对应的数据库下有个函数菜单,右键新建函数==>完成 2.创建测试表 user,懒得写语句 反正每个人需要的表不一样 3.创建函数,直接上代码!注意中间的insert语句换成你自己需要的插入语句,可利用随机方法保证生成的数据不同 CREATE DEFINER=`root`@`localhost` FUNCTION `ins_data`(`num` int) RETURNS int(11) BEGIN DECLARE i i

  • Python中elasticsearch插入和更新数据的实现方法

    首先,我的索引结构是酱紫的. 存储以name_id为主键的索引,待插入或更新数据为: 一般会有有两种操作: 以下图片为个人见解,我没试过能不能直接运行,但形式上没错. 数据不存在,我需要插入地址为空字符串. 单条插入: 批量插入: 该数据存在,我需要更新地址字段为空字符串. 单条更新: 批量更新: 总结 以上所述是小编给大家介绍的Python中elasticsearch插入和更新数据的实现方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的! 您可能感兴趣的文章: 使用

  • PHP生成随机字符串(3种方法)

    如用户注册生成随机密码,用户重置密码也需要生成一个随机的密码.随机密码也就是一串固定长度的字符串,文章整理了几种生成随机字符串的方法. 方法一 1.在33 – 126中生成一个随机整数,如35. 2.将35转换成对应的ASCII码字符,如35对应#. 3.重复以上1.2步骤n次,连接成n位的密码. 该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据

  • PHP生成指定随机字符串的简单实现方法

    本文实例讲述了PHP生成指定随机字符串的简单实现方法.分享给大家供大家参考.具体分析如下: 这是一个简单的函数,没有对生成的内容作强制设定.所以在生成的字符串长度较少的时候,会出现没有指定类型字符的情况.当然,修改起来也很简单,这里就不做添加了. /** * @param string $type * @param $length * @return string */ function randomString($type="number,upper,lower",$length){

  • MySQL循环插入千万级数据

    1.创建测试表 CREATE TABLE `mysql_genarate` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uuid` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5999001 DEFAULT CHARSET=utf8; 2.创建一个循环插入的存储过程 CREATE DEFINER=`root`@`localhost` PROCEDURE

  • 用一条mysql语句插入多条数据

    假如有一个数据表A: id name title addtime 如果需要插入n条数据 : $time= time(); $data = array( array( 'name'=>'name1','title'=>'title1','addtime'=>$time; ), array( 'name'=>'name2','title'=>'title2','addtime'=>$time; ), array( 'name'=>'name3','title'=>

  • java生成随机字符串的两种方法

    本文实例为大家分享了java生成随机字符串的具体代码,供大家参考,具体内容如下 import java.util.Random; public class CharacterUtils { //方法1:length为产生的位数 public static String getRandomString(int length){ //定义一个字符串(A-Z,a-z,0-9)即62位: String str="zxcvbnmlkjhgfdsaqwertyuiopQWERTYUIOPASDFGHJKLZ

  • js 按照指定间隔 向字符串中插入随机字符串的实现代码

    var getNewString = function (){ var getIc = function (ic){ var arric = ic.split(","); randomIc = arric[Math.floor(Math.random()*(arric.length))]; return randomIc }; return function (oc,ic,re){ var reStr = "(.{"+re+"}|.*)"; va

随机推荐