Mungkin Anda harus menggabungkan kedua metode ini dengan sengaja. Kenapa ???
Mari kita gunakan tabel itu (MySQL-dialek)
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)
);
Harap perhatikan bahwa, dengan pengecualian dari KUNCI UTAMA, setiap indeks yang Anda buat harus didahului dengan deleted
bendera dan diakhiri dengan id
.
Mari kita buat tabel batu nisan
CREATE TABLE mytomb SELECT id FROM mydata WHERE 1=2;
ALTER TABLE mytomb ADD PRIMARY KEY (id);
Jika meja Anda sudah memiliki deleted
bendera, Anda bisa mengisi tabel batu nisan
INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;
OK sekarang data dan nisan sudah disiapkan. Bagaimana Anda melakukan penghapusan?
Katakanlah Anda menghapus setiap orang di kode pos 07305. Anda akan menjalankan yang berikut:
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';
OK ini sepertinya banyak overhead baik cara Anda melihatnya.
Sekarang, apakah Anda ingin melihat semua data yang dihapus? Berikut ini dua cara berbeda:
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
Jika jumlah id di mytomb lebih besar dari 5% dari jumlah baris mydata, itu adalah pemindaian tabel penuh. Jika tidak, pemindaian indeks dengan pencarian untuk setiap baris. Catat tolok ukur apa pun dalam hal ini. Cari menjelaskan rencana.
Sekarang, apakah Anda ingin melihat setiap orang di kode pos 07304? Berikut ini dua cara berbeda:
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'
Bagaimana dengan penghapusan massal? Berikut ini dua cara berbeda:
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
KESIMPULAN
Sekarang, saya tidak mengatakan untuk tetap menggunakan kedua metode ini. Melakukan hal ini dari waktu ke waktu mengungkapkan metode mana yang lebih cepat dalam hal operabilitas keseluruhan. Anda harus memutuskan tolok ukur mana untuk meminta data langsung, meminta data yang dihapus, dan penghapusan masal paling sesuai untuk Anda.