MySQL: является ли разделение хорошим способом обработки удалений? - PullRequest
3 голосов
/ 07 ноября 2010

У меня есть таблица MySQL:

CREATE TABLE responses (
    id INT NOT NULL AUTO_INCREMENT,
    other_id INT NOT NULL,
    details TEXT,
    deleted BOOLEAN,
    PRIMARY KEY (id)
);

Пользователи могут удалять записи в responses.

Мой план - использовать поле deleted для осуществления удаления. Каждый раз, когда пользователь удаляет запись, я установлю deleted на 1.

Время от времени я могу захотеть избавиться от всех удаленных записей или заархивировать их. Я думаю об использовании разбиения, чтобы сделать это быстрее:

PARTITION BY LIST(deleted) (
    PARTITION pActive VALUES IN (0),
    PARTITION pDeleted VALUES IN (1)
);

У меня вопрос: не замедлит ли это процесс удаления? Теперь, когда я изменяю «удаленное» поле записи, MySQL должен был бы переместить запись в совершенно другой раздел. Кажется, это может быть медленно.

Любые предложения будут с благодарностью.

Ответы [ 2 ]

3 голосов
/ 07 ноября 2010

В прошлом я участвовал в проекте, где использовался этот подход, и лично я чувствую, что это не лучший подход.Я думаю, что лучше просто удалить записи.Когда у вас есть такой флаг, каждый, кто использует вашу базу данных, должен понимать, что записи, которые существуют в таблице, могут не быть «настоящими» записями, в зависимости от того, установлен ли удаленный флаг.Это просто делает базу данных менее интуитивно понятной и трудной в использовании, на мой взгляд.

Если вы беспокоитесь о производительности, я бы посмотрел на правильное распределение ваших табличных пространств, и вы все равно можете использовать схему разбиения.Вы можете разделить данные по годам и месяцам (если вам нужен этот уровень детализации), чтобы помочь с производительностью.

Но я бы избегал флага удалений.В проекте, над которым я работал, он просто стал настоящей головной болью.Например, что, если кто-то попытается вставить другую запись, точно такую ​​же, как та, которая была «удалена» (удалено здесь означает, что удаленный флаг равен true).Устанавливаете ли вы значение false в существующую запись или вставляете другую новую запись?Если вы вставите новую запись, как вы определите свой первичный ключ в таблице, поскольку теперь у вас есть 2 записи с одним и тем же ключом?Вы делаете deleted часть ключа?Дело в том, что вам приходится иметь дело со всеми этими нетривиальными проблемами.

3 голосов
/ 07 ноября 2010

Да, я ожидаю, что переход между двумя состояниями будет медленнее, потому что он будет передаваться между разделами. Но удаленные / не удаленные запросы к существующим значениям будут выполняться быстрее, хотя запросы, не связанные со статусом удаления, не будут улучшены.

Это все о том, что является самой распространенной операцией в таблице, и о том, что допускаются компромиссы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...