配列をループし、各パスで MySQL ストアド関数を呼び出す PHP スクリプトがあります。
サーバーのパフォーマンスに深刻な影響を与えています。私の設計ではダメだと思います。これがどのように機能するかです(疑似コード)
- PHP のソースからデータを取得します
- 配列内の各アイテムに対して
- テーブルにデータを挿入/更新する MySQL Stored 関数を呼び出す
- 次のアイテムに移動
- エンドループ
MySQL ストアド関数
- 説明的な文字列 (インデックス付き) を検索します
- 存在する場合は、それに関連付けられている ID をローカル変数に割り当てます。そうでない場合は、新しい ID を挿入し、その新しい ID をローカル変数に割り当てます。
- 別の文字列、ID ペアに対して上記と同様の手順を実行します
- 渡されたデータの大部分を挿入/更新します
それを解決しようとする試み
- 最初は 3 つの個別のストアド関数があり、それを 1 つにマージしました。しかし、それは問題を解決しませんでした。
- また、検索されたフィールドがインデックス化されていることを確認しました
- 私は、各呼び出しでストアド関数をループして呼び出している可能性が最も高いと結論付けました。おそらく、リリースされていないか、後続の反復ごとにゆっくりとリリースされるプロセス/スレッドを割り当てます
- 私はカーソルについて読んだことがありますが、特に一括操作では良い方法ではなく、ほとんどの場合、より効率的な非手続き型 (セットベース) の代替手段があることを理解しています。または、そのルートを試す必要がありますか?
- ループ内でクエリ テキスト全体を作成し、それを 1 つの大きな SQL バッチとして実行することはまだ試みていません。タイムアウトの問題や、挿入/更新エラーの追跡がさらに困難になることを恐れていますが。
アドバイスや経験を共有してください。疑似コードまたはスニペットも歓迎します よろしくお願いします!