4

デバッグモデルに1つの関数があり、アプリにダミーデータを追加して、その速度などをテストするために使用します...

問題は、2つの異なるテーブルにレコードを追加する必要があり、各レコードがdbに追加される前に、重複するユーザー名などをチェックする必要があるため、少し時間がかかることです...

また、この手順は、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");
            }
        }
    }
}
4

3 に答える 3

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クエリをデータベースに送信することを回避し、すべてを一度に実行することができます。

于 2012-04-17T11:58:57.100 に答える
2

現実的なサンプル/テストデータを本当に探しているのであれば、generatedata.comを使用する必要があると思います。

http://www.generatedata.com/

これは私がこれまでに見た中で最高の1つです。

于 2012-04-17T12:01:08.423 に答える
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
于 2012-04-17T12:09:20.887 に答える