【问题标题】:Mysql - Create sample data from existing rowsMysql - 从现有行创建示例数据
【发布时间】:2017-10-25 15:11:00
【问题描述】:

我有一个大约 50K 行的表。我需要将这些数据乘以 10 倍以至少有 5M 行来测试性能。现在,我从 CSV 文件导入 50K 需要花费很长时间,所以我不想创建 5M 记录文件然后将其导入 SQL。

有没有办法一遍又一遍地复制现有行来创建 5M 条记录?我不介意这些行是否相同,它们应该只有一个不同的 id 这是主要(自动增量)列。

我目前正在使用 phpMyAdmin 在 XAMPP 上执行此操作。

【问题讨论】:

  • 你的应用平台是什么?你在使用像 laravel 这样的 MVC 吗?
  • 我们还没有开始在网站上工作。事实上,我们正计划用这些数据来测试各种 db 系统和 php 框架的性能。

标签: mysql testing sample-data


【解决方案1】:
Insert into my_table (y,z) select y, z from my_table;  

其中 x 是您的自动递增 ID。

重复(非常少)次

【讨论】:

  • 大约 6 次重复将使您的数据量接近 100 倍。
  • 是的,今天和 2.5 年前一样真实
【解决方案2】:

选项 1:使用联合

 insert into your_table (col1,col2)
    select col1,col2  from your_table
    union all 
    select col1,col2 from your_table
    union all 
    select col1,col2 from your_table
    union all 
    select col1,col2 from your_table
    continued...

选项 2:使用 10 条记录的虚拟表并进行交叉连接

创建一个 10 行的虚拟表

insert into your_table (col1,col2)
select col1,col2 from your_table, dummy_table

【讨论】:

  • SELECT * 不能使用主键,你会得到重复键错误。
  • 您需要选择除id 列之外的所有列。
  • 你想多了。
【解决方案3】:

如果您有〜50k行,则将它们复制99次将为您提供〜5米行。 为此,您可以创建一个过程并使用循环复制99次。

DELIMITER $$
CREATE PROCEDURE populate()
BEGIN
  DECLARE counter INT DEFAULT 1;

  WHILE counter < 100 DO
    insert into mytable(colA, colB) select colA, colB from mytable;
    SET counter = counter + 1;
  END WHILE;
END $$

DELIMITER ;

然后您可以使用

调用该过程
call populate();

【讨论】:

  • 嘿,我不得不说它不是99次,但大约6!你看,因为你一遍又一遍地应对同一个表,线条数量是指数增长的。 span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 2014-08-17
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
相关资源
最近更新 更多