MySQL таблицы и стратегии удаления - PullRequest
4 голосов
/ 16 декабря 2010

Я работаю в социальной сети, как подмножество Facebook.Я думаю, это означает, что приложение будет более тяжелым для чтения, чем для тяжелой записи (т.е. больше SELECTS, чем INSERTS, UPDATES или OR DELETES)

Я планирую использовать MySQL для базы данных, используя MyISAM.Каждая таблица в базе данных будет содержать следующие три поля:

  • CREATED - поле даты, содержащее время создания записи
  • UPDATED - поле даты, содержащеевремя изменения записи
  • ROWSTATUS - поле CHAR (1), содержащее флаг из одного символа, показывающий, активна ли запись, неактивна или удалена (с использованием значений «A», I иD, соответственно).

Через класс-оболочку PHP мы гарантируем, что все запросы SELECT включают ROWSTATUS, а запросы UPDATE также обновляют столбец UPDATED, а запросы INSERT обновляют столбец CREATED.

Я планирую на самом деле не удалять какие-либо записи, выбрав вместо этого обновить поле ROWSTATUS этих записей до D, чтобы показать, что оно удалено (т.е. мягкое удаление).

У нас есть процедура SQLкоторый физически удаляет удаленные данные через 10 дней.

Однако я просматривал эту статью , в которой утверждается, что нет необходимости удалять физически, потому чтое блокировки накладных расходов.Скорее, автор предложил использовать эту схему:

SELECT e.eventid,e.title
    FROM events e
   WHERE NOT EXISTS
    (SELECT * FROM event_deletes ed WHERE ed.eventid = e.eventid);

Мне интересно, как моя схема сравнивается с этим предложенным механизмом, и какой из них лучше?Я не мог найти окончательного ответа самостоятельно.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2010

Как говорит @ Pentium10, в вашем плане нет ничего плохого. На самом деле это довольно стандартный подход.

Проблема только в том, что если вы используете MyISAM, ваши ОБНОВЛЕНИЯ приведут к блокировке всей таблицы во время выполнения запроса. Это создает узкое место, потому что вы можете обновлять или удалять только одну запись за раз.

Если у вас нет причин использовать MyISAM, я бы порекомендовал перейти на InnoDB в качестве движка базы данных. InnoDB использует блокировку на уровне строк, поэтому ваши запросы UPDATE не будут блокировать другие UPDATE. Он также имеет некоторые другие полезные функции, такие как поддержка транзакций и ограничения ссылочной целостности.

0 голосов
/ 16 декабря 2010

Единственная проблема, которую я вижу здесь, по сравнению с этой статьей, это то, что вы обрабатываете только блокировки для вызова DELETE.

Вы должны знать, что Операторы UPDATE и DELETE всегда должны вызывать монопольную блокировку для таблицы MyISAM.

Вот почему в статье рекомендуется использовать INSERT вместо UPDATE rowstatus. Вы должны идти, как говорится в статье. Создайте отдельную таблицу для хранения удаленных идентификаторов и используйте рекомендуемое объединение для выбора, чтобы получить не удаленные записи. Таким образом, при выполнении действия удаления конечного пользователя вы просто вставляете в таблицу и не вызываете блокировку UPDATE для таблицы. Если вы добавите правильные ключи к обеим таблицам, объединение будет выполнено только для индексов, например, для SELECT будет быстрым.

Вы также вводите накладные расходы, если сохраняете время обновления. Вы должны отказаться от этой идеи, так как она бесполезна, и вы не будете использовать, чтобы сообщить, когда была обновлена ​​запись.

...