Belki iki yöntemi bilerek birleştirmelisiniz. Neden ???
Bu tabloyu kullanalım (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 hariç, yaptığınız her dizinin öncesinde deleted
bayrak olması ve ile bitmesi gerektiğini unutmayın id
.
Mezar taşı tablosunu oluşturalım
CREATE TABLE mytomb SELECT id FROM mydata WHERE 1=2;
ALTER TABLE mytomb ADD PRIMARY KEY (id);
Tablonuzda zaten bir deleted
bayrak varsa, mezar taşı tablosunu doldurabilirsiniz
INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;
Tamam şimdi veri ve mezar taşı hazır. Silme işlemlerini nasıl gerçekleştirirsiniz?
Diyelim ki 07305 posta kodundaki herkesi siliyorsunuz. Aşağıdakileri çalıştırırsınız:
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';
Tamam bu her iki şekilde de bakıldığında bir sürü yük gibi görünüyor.
Şimdi, silinen tüm verileri görmek istiyor musunuz? İşte iki farklı yol:
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
Mytomb'deki id sayısı, verilerimin satır sayısının% 5'inden fazlaysa, tam tablo taramasıdır. Aksi takdirde, her satır için arama içeren bir dizin taraması. Bu bakımdan tüm ölçütlere dikkat edin. Açıklama planlarına bakın.
Şimdi, 07304 posta kodlu herkesi görmek ister misiniz? İşte iki farklı yol:
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'
Kitle silmeye ne dersiniz? İşte iki farklı yol:
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
SONUÇ
Şimdi, her iki yöntemi de saklamayı söylemiyorum. Bunu zaman içinde yapmak, genel çalışabilirlik açısından hangi yöntemin daha hızlı olduğunu gösterir. Canlı verileri sorgulamak, silinen verileri sorgulamak ve toplu silme işlemlerinin sizin için en iyi sonucu vereceğine karar vermelisiniz.