web-dev-qa-db-ja.com

ROW = NULLを維持するか、それを削除しますか?

このスキームでは

id  uid     content
1   1       A
2   1       B
3   1       C
4   1       D
5   1       E

ユーザーがid = 3, 4, 5の行が不要であると判断した場合、contentNULLに設定するか、行を削除する方が良いですか?

このプロセスは何度も発生し、彼はおそらくNULLスロットを再び使用します。将来的に変更する場合に備えて、UPDATEを引き続き使用し、NULLに設定しますか?または単に行全体をDELETEしますか?

問題は次のようなものです。

DELETE行? INSERT | -> DELETE-> INSERT .. DELETE-> INSERT

または

UPDATE行? INSERT | -> UPDATE to NULL-> UPDATE to value .. UPDATE to NULL-> UPDATE to value

5
Toleo

行が頻繁に再利用される場合は、値をNULLに設定するか、列is_deletedを追加して、行がソフト削除されたことを示すことをお勧めします。行を継続的に削除および挿入すると、テーブルが大幅に断片化され、パフォーマンスの低下の原因となる可能性があります。これは通常、キュー内に既知の数のスロット(行)があり、それらのスロットが事前に割り当てられているキューに使用されます。

行が再利用されない場合、または非常にまれに再利用される場合は、それらの行によって使用されているスペースの割り当てを解除することをお勧めします。

6
Max Vernon

MaxVernonの答え(頭に釘を打つ、+ 1 !!!) に加えて、廃棄済みテーブルを使用して、どの行をソフト削除できるかを監視することもできます。 Mar 05, 2012からの投稿を参照してください トゥームストーンテーブルとデータベースの同期および一時削除シナリオでの削除済みフラグ

どちらに住むことができるか検討してください

  • DELETEを完全に使用すると、行が削除され、スペースが利用可能になります。 DELETEコマンドは、InnoDB配管(ロック、ロールバックセグメントなど)を経由する必要があります。
  • 削除フラグの使用もInnoDBの管理の対象になります(断片化が少ない)
  • トゥームストーンアプローチと削除フラグは、アプリケーションロジックとそれに専用の小さなコードフレームワークに行削除の負担をかけますが、InnoDBはそれをストレージエンジンに組み込んでいます

結局のところ、DELETEは最も単純で心配のない(または少なくとも最も予測可能な)アプローチです。

4
RolandoMySQLDBA