4

ばかげた質問で申し訳ありませんが、私は最近、最もばかげたプログラマーのように感じる日があります。あなたの助けが必要です。私は現在、PHP と MYSQL を使用して開発しています。そこでは、非常にスキルが低く、継承されたプロジェクトに取り組んでいます。

TABLE_A としましょう、ほぼ 6,000 レコードを含むデータベース テーブルがあり、TABLE A のレコードを反復処理し、すべてのレコードについて、TABLE_A(Id) からの PK が TABLE_B の FK である TABLE B に 2 つの新しいレコードを作成する必要があります。特別なことはありませんよね?もう 1 つ、これが起こっています。責めないでください。本番 DB で。そのため、テーブル B への挿入を 1 秒ごとに 10 レコードだけ実行するように要求されました。さらに、次のような ID のリストがあります: 1,2,4,6,7,8,9,11,12,15,16,.. から 6k まで。だから私は基本的にできません:

for ($i = 1; $i <= MAX(id); $i++) {
    //create two new records in TABLE B
}

私は研究に時間を費やしましたが、アイデアを思いつくために、皆さんと話し合う必要があります. 正確な解決策を教えてほしいわけではありませんが、それについてどう考え、どのように解決策を導き出すかを学びたいと思っています。帰り道、ふと思った。だから私は自分の頭の中でアルゴリズムを作成しました。これは、私が知っていることとおそらく使用することについて、私の頭の中で段階的なプロセスです。

  1. 1 秒あたり 10 回の挿入しか実行できないことがわかっているため、テーブル A からの選択を 1 つのバッチで 5 行だけに制限する必要があります。
  2. したがって、おそらく MySQL 構文を使用できます: LIMITand OFFSET、たとえば:select * from t LIMIT 5 OFFSET 0
  3. これは、前のバッチの最後のレコードの ID を保存する必要があることを意味します。
  4. sleep()現在のバッチを終了した後、新しいバッチを開始する前に、1 秒間待機する必要があります (PHP メソッドの使用を考えています)。
  5. ループが必要
  6. TABLE_A の正確な行数は現在使用できません
  7. 新しいレコードの挿入は簡単です。繰り返しに集中してください。

この問題から何かを学びたいので、うまくいくかどうかはわかりません。DB の接続などについては省略し、アルゴリズムだけに焦点を当てて、ハイブリッド PHP/Mysql/Pseudo コードを記述します。

$limit=5
$offset=0;

function insert($limit, $offset){
   $stm = $db->prepare("SELECT id FROM tableA LIMIT :limit OFFSET :offset");
   $stm->execute(array('limit' => $limit, 'offset' => $offset));
   while($stm->rowCount() > 0){ 
      $data = $stm->fatchAll();
      foreach($data as $row){
         // insert into TABLE_B
      }
      sleep(1);
      $offset +=5;
      $this->insert($limit, $offset);
   }
}

この再帰が機能するかどうかは完全にはわかりません。紙の上では実現可能に見えます。しかし、パフォーマンスはどうですか?この場合は問題ありませんか?

おそらく主な質問は次のとおりです。それを行うためのより良い解決策を知っていますか?

コメント、考え、提案、アイデア、および実行可能な解決策を思い付く手順の詳細な説明に感謝します。おそらく、アルゴリズムの分析と設計についてもっと掘り下げる必要があります。良いリソースを知っていますか?

(文法ミスはごめんなさい、私はネイティブスピーカーではありません)

4

1 に答える 1