Можливо, вам слід поєднати ці два способи спеціально. Чому ???
Давайте скористаємося цією таблицею (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)
);
Зауважте, що, за винятком ОСНОВНОГО КЛЮЧА, кожному введеному вами індексу повинен передувати deleted
прапор і закінчуватися символом id
.
Давайте створимо надгробну таблицю
CREATE TABLE mytomb SELECT id FROM mydata WHERE 1=2;
ALTER TABLE mytomb ADD PRIMARY KEY (id);
Якщо на вашому столі вже є deleted
прапор, ви можете заповнити таблицю з надгробками
INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;
Гаразд, дані та надгробна плита підготовлені. Як виконувати видалення?
Скажімо, ви видаляєте кожну особу в поштовому індексі 07305. Ви виконаєте наступне:
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';
Гаразд це здається великим накладним способом будь-який спосіб ви дивитесь на це.
Тепер ви хочете побачити всі видалені дані? Ось два різні способи:
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
Якщо кількість ідентифікаторів в mytomb перевищує 5% від кількості рядків моїх даних, це сканування повної таблиці. В іншому випадку - індексне сканування з пошуком для кожного рядка. Зверніть увагу на будь-які орієнтири з цього приводу. Пошук планів пояснення.
Тепер ви хочете бачити кожну людину за поштовим індексом 07304? Ось два різні способи:
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'
Як щодо масових делетів? Ось два різні способи:
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
ВИСНОВОК
Зараз я не говорю дотримуватися обох методів. Згодом це виявляє, який метод швидший з точки зору загальної працездатності. Ви повинні вирішити, які орієнтири для запиту на реальні дані, запити на видалені дані та масові видалення найкраще підходять для вас.