【问题标题】:insert dummy data to mysql fast快速将虚拟数据插入mysql
【发布时间】:2012-04-17 11:34:47
【问题描述】:

我的调试模型中有 1 个函数,我想使用它来向我的应用添加虚拟数据以测试其速度等...

问题是它需要将记录添加到 2 个不同的表中,并在将每条记录添加到数据库之前检查重复的用户名等,因此需要一些时间...

关于我想在 for 循环中一次添加的 $total 不同的虚拟记录重复此过程...

例如,对于 100 个新用户,我想添加大约需要 5 秒钟。

这个时间好还是我需要优化它?

如果我想一次添加 1000,10000 个用户怎么办?有可能吗?

编辑: 调用插入数据的函数:

public function registerRandomUsers($total = 1){
    $this->load->model("misc_model");
    $this->load->model("encryption_model");
    $this->load->model("signup_model");

    for ($i=1;$i<=$total;$i++){
        $username = $this->misc_model->generateRandomString(15);
        $flag = false;
        while ($flag == false){
            if ($this->user_model->usernameExist($username)){
                $username = $this->misc_model->generateRandomString(15);
            }else{
                $flag = true;

                $password = 'Test123';
                $email = $username.'@email.com';
                $data = array(
                    'username' => $username,
                    'password' => $password,
                    'email' => $email
                );
                $this->signup_model->submitRegistration($data);
                $userdata = $this->user_model->getUserData($username, "username");
            }
        }
    }
}

【问题讨论】:

  • @scibuff 用函数更新帖子

标签: php mysql codeigniter records


【解决方案1】:

如果您不担心将随机字符串作为用户名,只需设置$email = 'user'.$i.'@email.com';(这样您就不必担心冲突)。这将运行缓慢的主要原因是因为您在循环的每次迭代中都向数据库发送新查询 - 生成批量插入字符串会快得多,例如:

INSERT INTO user (email,pass)
VALUES ('user1@email.com','Test123')
,      ('user2@email.com','Test123')
,      ('user3@email.com','Test123')
,      ('user4@email.com','Test123')
,      ('user5@email.com','Test123');

通过这种方式,您可以避免 tcp 流量因向数据库发送 10000 个查询而产生的开销,并且一次性完成所有操作。

【讨论】:

  • 我可以像 $sql 一样追加 .= " ('$email'. '$pass'),";在主 sql 查询上
  • @Mikey,我看到的批量插入语句的唯一问题是,这样做的目的是测试“真实世界”的用户注册?批量插入不是典型的注册,因为这些将单独处理。但是,正如您指出的那样,IT 会加速此脚本。
【解决方案2】:

我认为,如果您真的在寻找一些真实的样本/测试数据,您应该使用generatedata.com

http://www.generatedata.com/

这是迄今为止我见过的最好的之一。

【讨论】:

  • 您可以从 generateata.com 生成 CSV 或 SQL 文件,然后如果您的文件是 CSV,您可以使用 LOAD FILE 加载它,请参阅下面的 URL 以获得更多帮助。 blogs.digitss.com/database/mysql/… 如果是 SQL,您可以从命令行登录 mysql 并执行以下操作: >> 使用 ; >> source /home/myname/Downloads/testdata.sql 这应该针对选定的数据库运行所有测试数据 SQL 插入脚本,这样就完成了。
【解决方案3】:

这样构建您的查询

$conjuctions = str_repeat("('dummy@email.com','test pass'),", 20); // 20 dummy datas
$query = "INSERT INTO user (email,pass) VALUES ".substr($conjunctions,0,str_len($conjuctions).";"
                                               // ^ This is to remove the last comma

【讨论】:

  • 问题是我无法存储相同的电子邮件、用户名和用户 ID,因此它们需要不同...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 2022-11-12
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多