2

配列をループし、各パスで MySQL ストアド関数を呼び出す PHP スクリプトがあります。

サーバーのパフォーマンスに深刻な影響を与えています。私の設計ではダメだと思います。これがどのように機能するかです(疑似コード)

  1. PHP のソースからデータを取得します
  2. 配列内の各アイテムに対して
    1. テーブルにデータを挿入/更新する MySQL Stored 関数を呼び出す
    2. 次のアイテムに移動
  3. エンドループ

MySQL ストアド関数

  1. 説明的な文字列 (インデックス付き) を検索します
  2. 存在する場合は、それに関連付けられている ID をローカル変数に割り当てます。そうでない場合は、新しい ID を挿入し、その新しい ID をローカル変数に割り当てます。
  3. 別の文字列、ID ペアに対して上記と同様の手順を実行します
  4. 渡されたデータの大部分を挿入/更新します

それを解決しようとする試み

  • 最初は 3 つの個別のストアド関数があり、それを 1 つにマージしました。しかし、それは問題を解決しませんでした。
  • また、検索されたフィールドがインデックス化されていることを確認しました
  • 私は、各呼び出しでストアド関数をループして呼び出している可能性が最も高いと結論付けました。おそらく、リリースされていないか、後続の反復ごとにゆっくりとリリースされるプロセス/スレッドを割り当てます
  • 私はカーソルについて読んだことがありますが、特に一括操作では良い方法ではなく、ほとんどの場合、より効率的な非手続き型 (セットベース) の代替手段があることを理解しています。または、そのルートを試す必要がありますか?
  • ループ内でクエリ テキスト全体を作成し、それを 1 つの大きな SQL バッチとして実行することはまだ試みていません。タイムアウトの問題や、挿入/更新エラーの追跡がさらに困難になることを恐れていますが。

アドバイスや経験を共有してください。疑似コードまたはスニペットも歓迎します よろしくお願いします!

4

1 に答える 1