快速将虚拟数据插入mysql

时间:2012-04-17 11:34:48

标签: php mysql codeigniter records

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

问题是它需要将记录添加到2个不同的表中,并在每个记录添加到db之前检查重复的用户名等,这样需要一点时间......

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

例如我要添加的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");
            }
        }
    }
}

3 个答案:

答案 0 :(得分:2)

如果您不担心随机字符串作为用户名,只需设置$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个查询到数据库的开销,并让它一次性完成。

答案 1 :(得分:2)

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

http://www.generatedata.com/

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

答案 2 :(得分:1)

以此为基础构建您的查询

$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