Talvez você deva combinar os dois métodos de propósito. Por quê ???
Vamos usar essa tabela (dialeto 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)
);
Observe que, com exceção da PRIMARY KEY, todos os índices que você cria devem ser precedidos pelo deleted
sinalizador e terminar com o id
.
Vamos criar a tabela de marca para exclusão
CREATE TABLE mytomb SELECT id FROM mydata WHERE 1=2;
ALTER TABLE mytomb ADD PRIMARY KEY (id);
Se sua tabela já tiver um deleted
sinalizador, você poderá preencher a tabela tommstone
INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;
OK, agora os dados e a lápide estão preparados. Como você executa exclusões?
Digamos que você esteja excluindo todas as pessoas no CEP 07305. Você executaria o seguinte:
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, isso parece um monte de sobrecarga de qualquer maneira que você olha para ele.
Agora, você deseja ver todos os dados excluídos? Aqui estão duas maneiras diferentes:
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
Se o número de IDs no mytomb for maior que 5% da contagem de linhas de mydata, será uma verificação completa da tabela. Caso contrário, uma varredura de índice com uma pesquisa para cada linha. Observe quaisquer benchmarks nesses aspectos. Pesquise os planos de explicação.
Agora, você quer ver todas as pessoas no CEP 07304? Aqui estão duas maneiras diferentes:
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'
Que tal exclusões em massa? Aqui estão duas maneiras diferentes:
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
CONCLUSÃO
Agora, não estou dizendo para manter os dois métodos. Fazer isso ao longo do tempo revela qual método é mais rápido em termos de operacionalidade geral. Você deve decidir quais parâmetros de referência para consultar dados ativos, consultar dados excluídos e exclusões em massa que funcionam melhor para você.