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

作者:mdxy-dxy 时间:2024-01-19 11:43:02 

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

创建表:


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,随机字符串
0
投稿

猜你喜欢

  • 详解Python模块化编程与装饰器

    2023-06-30 19:49:07
  • 利用Python编写个有趣的记仇本

    2022-08-25 19:20:20
  • python爬虫Scrapy框架:媒体管道原理学习分析

    2022-11-23 15:07:03
  • 详解supervisor使用教程

    2022-02-18 09:12:07
  • Sql Server 2000 一些安全设置

    2008-02-13 18:57:00
  • SQL SERVER 中构建执行动态SQL语句的方法

    2024-01-22 10:01:46
  • Python实现翻转数组功能示例

    2022-02-28 09:03:09
  • 用Dreamweaver MX轻松操作表格

    2009-05-29 18:41:00
  • document.all还是document.getElementsByName?

    2024-04-18 09:34:28
  • python实现从一组颜色中找出与给定颜色最接近颜色的方法

    2023-04-23 01:48:44
  • Python中利用原始套接字进行网络编程的示例

    2023-06-22 18:02:03
  • asp如何检测HTTP表头信息?

    2010-06-28 18:20:00
  • 必须会的SQL语句(五) NULL数据处理和类型转换

    2024-01-18 23:40:51
  • 一段ASP的HTTP_REFERER判断代码

    2011-03-25 10:41:00
  • 在ASP中使用SQL语句之12:连接

    2009-04-23 18:27:00
  • MySQL 事务概念与用法深入详解

    2024-01-14 02:56:06
  • 基于Python中单例模式的几种实现方式及优化详解

    2022-10-24 14:20:45
  • MySQL中Distinct和Group By语句的基本使用教程

    2024-01-26 09:51:53
  • 网页布局设计基础

    2008-10-16 13:58:00
  • 一个简单的SQL 行列转换语句

    2024-01-24 01:57:08
  • asp之家 网络编程 m.aspxhome.com