1

次の件名について疑問に思っています(MysqlのINSERT - InnoDBテーブルについて)。

私は他のシステム 2 の中でも特に行うシステムを持っています

  1. ニュースレターをユーザーに宣伝する
  2. 特定のタイプのユーザーへの一括メール

現在、ユーザーは 4k に増加し、おそらく 40k に増加します

大量の電子メールを送信しているときは、WHILE (すべてのユーザーをループ) で各ユーザーIDに対して INSERT を実行しています。

2 つの質問があります。

  1. これが最善の方法ですか?
  2. ユーザーが 40K (40.000 ユーザー) に達した場合、mysql-server はこれを維持できますか?

ありがとう、

これは私が使用しているコードです

    $query_write_mass = "SELECT id FROM mya_users ORDER by artist_real_address ASC";
    $result_write_mass = $db->prepare($query_write_mass);
    $result_write_mass->execute();
    while ( list($receiver_id) = $result_write_mass->fetch(PDO::FETCH_BOTH) ) { 

       $stmt = $db->prepare
         ("INSERT INTO inbox(folder_id, sender_id, sender_type, receiver_id, 
           receiver_type, title, message_body, time, date, flag, spam) 
           VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");

            $stmt->bindValue(1, 0, PDO::PARAM_INT);
            $stmt->bindValue(2, 0, PDO::PARAM_INT);
            $stmt->bindValue(3, 'x', PDO::PARAM_STR);
            $stmt->bindValue(4, $receiver_id, PDO::PARAM_INT);
            $stmt->bindValue(5, $receiver_type, PDO::PARAM_STR);
            $stmt->bindValue(6, $_POST['title'], PDO::PARAM_STR);
            $stmt->bindValue(7, $_POST['body'], PDO::PARAM_STR);
            $stmt->bindValue(8, date("G:i:s"), PDO::PARAM_STR);
            $stmt->bindValue(9, date("Y-m-d"), PDO::PARAM_STR);
            $stmt->bindValue(10, 'n', PDO::PARAM_STR);
            $stmt->bindValue(11, '', PDO::PARAM_STR);                                                                                                                                                                                                   

            $stmt->execute();   
     }

これは、社内メール システムの一括メール送信用です。

アップデート

この質問に対する適切な回答は、私の別の投稿 (解決済み) @ で見つけることができます。

複数の INSERTS と PDO 準備済みステートメントのセキュリティの維持

4

2 に答える 2

1

1) いいえ。可能であれば、一度に複数の行を挿入します。

INSERT INTO t VALUES (1, 'something'), (2, 'something else')...

また、すべてのユーザーに同様のレコードを挿入する場合、さらに優れたアプローチは次のようになります。

INSERT INTO t
SELECT 
    "something to insert for all users into t's column 1",
    "something to insert for all users into t's column 2",
    user.field1,
    user.field2
FROM user
-- WHERE some_condition_on_user_table

2)はい、whileループを続行しない限り(ただし、それでも機能する場合があります)

于 2013-08-06T20:53:15.020 に答える
1

MySql が 40k の挿入を処理できるかどうかを尋ねている場合、スペースが利用可能で、マシンが妥当であると仮定すると、これは問題になりません。1 日に数十万行を挿入するシステムがあります。

于 2013-08-06T20:51:55.547 に答える