Vous devriez peut-être combiner exprès les deux méthodes. Pourquoi ???
Utilisons cette table (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)
);
Veuillez noter qu'à l'exception de la CLÉ PRIMAIRE, chaque index que vous créez doit être précédé du deleted
drapeau et se terminant par le id
.
Créons la table tombstone
CREATE TABLE mytomb SELECT id FROM mydata WHERE 1=2;
ALTER TABLE mytomb ADD PRIMARY KEY (id);
Si votre table a déjà un deleted
indicateur, vous pouvez remplir la table tommstone
INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;
OK maintenant les données et la pierre tombale sont préparées. Comment effectuez-vous des suppressions?
Supposons que vous supprimiez chaque personne du code postal 07305. Vous exécuteriez ce qui suit:
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, cela semble être beaucoup de frais généraux de toute façon que vous le regardez.
Maintenant, voulez-vous voir toutes les données supprimées? Voici deux façons différentes:
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
Si le nombre d'identifiants dans mytomb est supérieur à 5% du nombre de lignes de mydata, il s'agit d'une analyse complète de la table. Sinon, une analyse d'index avec une recherche pour chaque ligne. Notez tous les repères à ces égards. Recherchez les plans d'explication.
Maintenant, voulez-vous voir chaque personne dans le code postal 07304? Voici deux façons différentes:
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'
Qu'en est-il des suppressions massives? Voici deux façons différentes:
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
CONCLUSION
Maintenant, je ne dis pas de garder les deux méthodes. Faire cela au fil du temps révèle quelle méthode est la plus rapide en termes d'opérabilité globale. Vous devez décider quels repères pour interroger des données en direct, interroger des données supprimées et des suppressions massives vous conviennent le mieux.