![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
No.3ベストアンサー
- 回答日時:
古い人間なので現状にあっていなかも知れませんが経験より。
このシステムはオンラインで、月次にバッチでメンテが出来るような環境であると想定しました。また、DBMSの物理的なキャッシュなどは考慮していません。
(1)削除フラグを使う
この目的は「消しちゃったけど戻したい」が主たる目的です。この条件でなければ、また、大量の削除でなければ、オンラインでのdeleteでも良いと思います。レコードが減る分、バックアップが楽になります。
(2)カラムに入っている内容を削除する
nullか空白でupdateするということですよね。インデックスにレコードが残るという観点ではメリットはないでしょう。検索において、削除されたレコードは取得されないので関係ないと思います。
(3)オンラインでの削除
deleteすることによってレコードが減ればそれだけインデックスが軽くなり(なれば)検索は早くなる可能性があります。ただし、これは非常に稀です。
(4)性能
「削除フラグを使う」でdeleteで良いと書きましたが実は「削除フラグ」という考え方は正しいかも知れません。
インデックスが張られているでしょうからこれらも更新の対象になります。
昔(10年前)では、I/Oは大体10ms/1件といった感じです。これは、update、delete、insert、インデックス更新が該当します。
例えば、3個のインデックスがあるテーブルで考えてみます。「削除フラグ」を使う場合、削除されたレコードを読み込まないために、すべてのインデックスに削除フラグが関連するはずです。
削除フラグを立てて他の列を空白等でupdateする場合、
[1]select for update ;1行確定
[2]update ;1行更新
[3]インデックス更新 ;インデックス1
[4]インデックス更新 ;インデックス2
[5]インデックス更新 ;インデックス3
の5回のI/Oが発生します。約50msかかる計算です。
また、deleteでは、
[1]select for update ;1行確定
[2]delete ;1行削除
[3]インデックス更新 ;インデックス1
[4]インデックス更新 ;インデックス2
[5]インデックス更新 ;インデックス3
の5回のI/Oが発生します。約50msかかる計算です。
オンラインでの性能面から見るとどちらも同じようになります。
結局はインデックス更新にも引っ張られますので、オンラインでの処理ではどちらでも良いということになります。
オンライン以外の性能ではdeleteした方がレコード少なくなるだけメリットが有るように感じます(レコードは少ないに越したことな無いです)。
長々と書きましたが、私はユーザ要件によって削除フラグを使うか否かを決めていました。
間違えた削除を戻す必要がないならdeleteで良いと思います。
メンテについてですが、容量に応じて色々な方法が考えられます。
件数が多くなるようでしたらファイルに吐き出して、削除レコードを削除し、LOADERで入れ込むことも考えられます。
MySQLはロックリソースが必要でしょうから(詳しく知りません)、想定件数で仕組みを考えるべきと考えます。
回答ありがとうございます
詳しい解説ありがとうございます
いろいろ勉強になりました
deleteを直接やってみたんですがphpmyadminから見るとオーバーヘッドが発生していました
updateだと発生していませんでした
みなさんの貴重な意見を聞いて、バックアップをとってから削除できるテーブルの行は削除しようと思います
ありがとうございました
No.2
- 回答日時:
>カラムに入っている内容を削除しただけでもパフォーマンスはよくなりますか?
中途半端であまりやる意義がないと思います
何を削除したか履歴が必要なら削除する際に削除済みデータを
別テーブルに取っておくほうがよいでしょう
回答ありがとうございます
やっぱりそうですよね。
別テーブルに移動ですか、そのほうがよさそうですね
参考になりました。ありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ドライブ・ストレージ Android端末でSDカードが機能しなくなりました 6 2023/02/17 17:20
- Android(アンドロイド) 【google One】グーグルワンの無料の15GBの容量が不足しています。スマホ内 7 2023/02/05 06:30
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- iPhone(アイフォーン) iphoneのicloud写真データ移動について 3 2022/11/28 18:11
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/10 11:34
- Google Drive gdriveアプリをpcから削除したい 3 2022/09/18 13:43
- タブレット ハーウェイのタブレット(Android)を使用しています。 ストレージが容量が 98%までいってしま 6 2023/02/17 18:03
- Gmail GMAILの不要メ-ルを一括で削除 2 2022/09/22 22:15
- LINE LINEのトーク内容一部を自分も相手も削除する方法 3 2022/10/21 03:27
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/10/03 09:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複合インデックスの設定に関して
-
検索エンジン検索結果から削除...
-
社名でデータ抽出できる検索シ...
-
LIKEの右側にカラムを指定でき...
-
複数のフィールドの検索
-
mySQL プライマリーキーのカラ...
-
SELECT文で、指定カラム以外の...
-
mysqlで50音順にorder byしたい。
-
DBエラーの意味
-
前と後という言葉の意味
-
SQLでカラムを追加し、条件に合...
-
スペースによる絞り込み検索をS...
-
構造が異なる二つのテーブルをu...
-
DB2(OS/390)のSECQTYについて
-
type date にnullをinsert
-
インデックスとは?オートナン...
-
Accessで文字列の一部を抽出す...
-
INDIRECT関数の代替方法は?
-
最大2147483647なのに何故int(1...
-
MySQLで先頭にカラムを追加
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユニーク制約とユニークインデ...
-
オートインクリメントについて
-
MySQLのKey属性「MUL」について
-
複数カラム検索で、LIKE "%検索...
-
SQL Server Management Studio...
-
大量の項目を対象に効率的に検...
-
インデックスについて
-
UPDATEつてインデックス貼って...
-
MySQLのインデックスについて
-
1000件以下の場合はカラム数に...
-
MySqlでのデータソートについて
-
テーブル設計について。
-
インデックス作成について
-
文字検索 (LIKE)を使った場合
-
複合インデックスの設定に関して
-
インデックスを張るべき項目に...
-
検索エンジン検索結果から削除...
-
INDIRECT関数の代替方法は?
-
DBの定義のサイズを大きくし過...
-
SELECT文で、指定カラム以外の...
おすすめ情報