ホームページ >データベース >mysql チュートリアル >mysql8.x での挿入無視のパフォーマンスの問題を解決する方法
での挿入はパフォーマンスの問題を無視します mysql での replace into の効率は非常に悪く、複数のプロセスが同時に使用されるとテーブルがロックされるため、更新には重複を使用する必要があります。これはよく知られています。挿入無視操作を使用してもパフォーマンスの問題が発生する可能性があるとは予想していなかったので、遭遇したこの問題を記録したいと思います。
初期化データをテーブルに挿入するために、10 個のプロセスを開いて、insertignore を使用してデータベースにデータを同時に挿入しました。各 insertignore ステートメントには 7 行のデータが含まれています。オンラインになってスクリプトの実行を開始すると、予期せず、データベースに多数のロック テーブルが表示されました。 innodb ステータス ログから判断すると、ロックされているのはテーブルの自動インクリメント ID の主キーです。
長時間デバッグした結果、挿入無視の場合、一意の ID を検出すると同時に、意図を検出するために、挿入されたデータの各行に対して S ロックが取得されることがわかりました。ロック (挿入意図) は、主キーの自動インクリメント ID フィールドに追加されます。)、一意のキーがより複雑な場合、一意のキーの検出時に主キーの挿入意図のロックが常に占有されます。また、挿入を無視すると、挿入目的のロックを主キー ID に追加する必要があるため、デッドロックが発生します。
上記の状況は mysql 8.x で発見されました。以前のバージョンの mysql では関連する問題に遭遇したことがないようなので、以前のバージョンの挿入無視に落とし穴があるかどうかはわかりませんmysql のバージョンですが、8.x 最良のバージョンは挿入無視であり、特に一意のキーがより複雑な (3 つまたは 4 つのフィールドで構成される) 場合は、複数行のデータを挿入しません。
INSERT ステートメントを使用してテーブルに複数の行を追加する場合、処理中にエラーが発生すると、MySQL はステートメントを終了してエラーを返します。その結果、テーブルには行が挿入されません。
ただし、insertignore ステートメントを使用すると、エラーの原因となった無効なデータを含む行は無視され、有効なデータを含む行がテーブルに挿入されます。
rree以上がmysql8.x での挿入無視のパフォーマンスの問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。