最近、mysql での CRUD 操作に関するビデオを見ましたが、そのビデオで気になったことが 1 つあります。コメンテーターは、ステータス列を使用する代わりに、mysql インデックスのパフォーマンスに悪い行を削除すると主張しました。
それで、これら2つの間に本当に違いはありますか?
最近、mysql での CRUD 操作に関するビデオを見ましたが、そのビデオで気になったことが 1 つあります。コメンテーターは、ステータス列を使用する代わりに、mysql インデックスのパフォーマンスに悪い行を削除すると主張しました。
それで、これら2つの間に本当に違いはありますか?
行の削除は、列に新しい値を設定するよりもかなりコストがかかります。データベースから行を削除しない人もいます (ただし、パフォーマンスの問題ではなく、履歴を保持するための場合もあります)。
私は通常、遅延削除を行います。アプリで行を削除する必要がある場合、実際には削除されませんが、代わりにステータスが設定されます。その後、トラフィックが少ない時間帯に、これらの削除を実行します。
一部のデータベース エンジンでは、削除されたレコードの領域を再利用できないため、データ ファイルを時々圧縮する必要があります。InnoDB がその 1 つであるかどうかはわかりません。
戦略は、行を削除するとすべてのインデックスに影響するのに対し、「ステータス」列を変更してもインデックスには影響しない可能性があると思います(カーディナリティが低いためにその列にインデックスを付けない可能性があるため)。
それでも、行を削除する場合、インデックスへの影響は最小限です。挿入によってページがいっぱいになると、インデックスのパフォーマンスに影響し、インデックスが再構築されます。これは、削除では発生しません。削除では、インデックス レコードに削除のマークが付けられるだけです。
MySQL は後で (負荷が低いときに) 削除された行をインデックスからパージします。したがって、削除はすでにキャッシュされています。なぜ倍の努力をするのですか?
削除するレコードをすばやく見つけるために、選択や更新と同様に、削除にはインデックスが必要です。そのため、MySQL インデックス パフォーマンスの不足または不適切なインデックスによる削除の遅さを責めないでください。delete ステートメントの WHERE 句は、インデックスを利用できる必要があります。InnoDB では、すべてのレコードまたは範囲をロックするのではなく、1 つのインデックス レコードのみをロックすることも重要です。