クライアントの同期の必要性のために、削除されたアイテムを追跡する必要があります。
一般に、トゥームストーンテーブルと、サーバーデータベースから行が削除されたときを追跡するトリガーを追加する方が基本ですか?元のテーブルを削除し、通常はビット型の列で削除済みとしてフラグを立てて、行が削除されたことと、削除が発生したときに追跡する別の列を示しますか?
クライアントの同期の必要性のために、削除されたアイテムを追跡する必要があります。
一般に、トゥームストーンテーブルと、サーバーデータベースから行が削除されたときを追跡するトリガーを追加する方が基本ですか?元のテーブルを削除し、通常はビット型の列で削除済みとしてフラグを立てて、行が削除されたことと、削除が発生したときに追跡する別の列を示しますか?
回答:
一般に、特定の要件を把握し、ほとんどの状況で最適に機能するものに基づいて設計上の決定を下すことをお勧めします。 どちらかが望ましいでしょう。収集するいくつかの詳細を次に示します。
たぶん、2つの方法を意図的に組み合わせる必要があります。なぜ ???
そのテーブルを使用しましょう(MySQL-dialect)
CREATE TABLE mydata
(
id int not null auto_increment
firstname varchar(16) not null,
lastname varchar(16) not null,
zipcode char(5) not null,
...
deleted tinyint not null default 0
KEY (deleted,id),
KEY (deleted,lastname,firstname,id),
KEY (deleted,zipcode,id),
KEY (lastname,firstname),
KEY (zipcode),
PRIMARY KEY (id)
);
PRIMARY KEYを除き、作成するすべてのインデックスの前にdeleted
フラグを付け、最後にid
。
トゥームストーンテーブルを作成しましょう
CREATE TABLE mytomb SELECT id FROM mydata WHERE 1=2;
ALTER TABLE mytomb ADD PRIMARY KEY (id);
テーブルに既にdeleted
フラグがある場合は、tomstoneテーブルにデータを入力できます
INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;
これで、データとトゥームストーンが準備されました。削除はどのように実行しますか?
07305郵便番号のすべての人を削除するとします。次を実行します。
INSERT IGNORE INTO mytomb SELECT id FROM mydata WHERE deleted=0 AND zipcode='07305';
UPDATE mydata SET deleted=1 WHERE deleted=0 AND zipcode='07305';
わかりました。これは、見方を問わず、多くのオーバーヘッドのようです。
ここで、削除されたすべてのデータを表示しますか?以下に2つの異なる方法を示します。
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
mytombのidの数がmydataのrowcountの5%を超える場合、全テーブルスキャンです。それ以外の場合、各行のルックアップを使用したインデックススキャン。これらの点でベンチマークに注意してください。説明計画を検索します。
さて、郵便番号07304のすべての人を見たいですか?以下に2つの異なる方法を示します。
SELECT * FROM mydata WHERE deleted=1 AND zipcode='07304';
SELECT A.* FROM mydata A LEFT JOIN mytomb B USING (id) WHERE B.id IS NULL AND A.zipcode='07304'
一括削除はどうですか?以下に2つの異なる方法を示します。
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
今、私は両方の方法を維持することを言っているのではありません。時間をかけてこれを行うと、全体的な操作性の点でどのメソッドが高速であるかがわかります。ライブデータのクエリ、削除されたデータのクエリ、および大量削除のベンチマークを最適に決定する必要があります。