Tal vez deberías combinar los dos métodos a propósito. Por qué ???
Usemos esa tabla (dialecto 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)
);
Tenga en cuenta que, con la excepción de la CLAVE PRIMARIA, cada índice que haga debe ir precedido por la deleted
bandera y terminar con id
.
Creemos la tabla de lápidas
CREATE TABLE mytomb SELECT id FROM mydata WHERE 1=2;
ALTER TABLE mytomb ADD PRIMARY KEY (id);
Si su tabla ya tiene una deleted
bandera, puede llenar la tabla tommstone
INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;
Bien, ahora los datos y la lápida están preparados. ¿Cómo se realizan las eliminaciones?
Supongamos que está eliminando a todas las personas en el código postal 07305. Ejecutarías lo siguiente:
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, esto parece un montón de gastos generales de cualquier manera que lo mires.
Ahora, ¿quieres ver todos los datos eliminados? Aquí hay dos formas diferentes:
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
Si el número de identificadores en mytomb es mayor al 5% del número de filas de mydata, es un escaneo completo de la tabla. De lo contrario, una exploración de índice con una búsqueda para cada fila. Tenga en cuenta los puntos de referencia a este respecto. Busque los planes de explicación.
Ahora, ¿quieres ver a todas las personas en el código postal 07304? Aquí hay dos formas 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'
¿Qué hay de las eliminaciones masivas? Aquí hay dos formas diferentes:
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
CONCLUSIÓN
Ahora, no estoy diciendo que conserve ambos métodos. Hacer esto con el tiempo revela qué método es más rápido en términos de operabilidad general. Debe decidir qué puntos de referencia para consultar datos en vivo, consultar datos eliminados y eliminaciones masivas funcionan mejor para usted.