Może powinieneś celowo połączyć te dwie metody. Dlaczego ???
Użyjmy tej tabeli (dialekt MySQL)
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)
);
Pamiętaj, że z wyjątkiem KLUCZA PODSTAWOWEGO każdy tworzony indeks powinien być poprzedzony deleted
flagą i kończyć się naid
.
Stwórzmy stół z nagrobkami
CREATE TABLE mytomb SELECT id FROM mydata WHERE 1=2;
ALTER TABLE mytomb ADD PRIMARY KEY (id);
Jeśli twój stół ma już deleted
flagę, możesz wypełnić tabelę Tommstone
INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;
OK, teraz dane i nagrobek są przygotowane. Jak przeprowadzasz usuwanie?
Załóżmy, że usuwasz każdą osobę z kodu pocztowego 07305. Uruchomiłbyś następujące:
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, tak czy inaczej, wygląda to na duże obciążenie.
Czy chcesz teraz zobaczyć wszystkie usunięte dane? Oto dwa różne sposoby:
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
Jeśli liczba identyfikatorów w mytomb jest większa niż 5% liczby wierszy moich danych, jest to pełne skanowanie tabeli. W przeciwnym razie skan indeksu z wyszukiwaniem każdego wiersza. Zwróć uwagę na wszelkie kryteria w tym zakresie. Wyszukaj wyjaśnienie planów.
Czy chcesz teraz zobaczyć każdą osobę w kodzie pocztowym 07304? Oto dwa różne sposoby:
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'
Co powiesz na masowe usuwanie? Oto dwa różne sposoby:
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
WNIOSEK
Nie mówię teraz o zachowaniu obu metod. Wykonanie tego z czasem ujawnia, która metoda jest szybsza pod względem ogólnej operacyjności. Musisz zdecydować, które testy porównawcze do sprawdzania danych na żywo, sprawdzania usuniętych danych i masowego usuwania działają najlepiej dla Ciebie.