Вопрос

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

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

  • CREATED - Поле даты, содержащее время, которое была создана
  • UPDATED - Поле даты, содержащее время, когда запись была изменена
  • ROWSTATUS - Поле Char (1), содержащее один флаг символа, чтобы показать, является ли запись активной, неактивной или удаленной (используя значения 'a', I, а также D, соответственно).

Через класс PHP обертки мы гарантируем, что все выбранные запросы включают в себя Rowstatus, а запросы на обновление также обновляют обновленный столбец и вставьте запросы, обновляя созданный столбец.

Я планирую не удалять какие -либо записи, вместо этого выбрав обновление этого поля 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);

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

Это было полезно?

Решение

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

Проблема в том, что если вы используете Myisam, ваши обновления приведут к блокировке всей таблицы, пока заполняется запрос. Это вводит узкое место, потому что вы можете обновлять или удалять только одну запись за раз.

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

Другие советы

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

Ты должен знать что ОБНОВЛЕНИЕ И УДАЛЕНИЯ ОТЧЕТЫ всегда должны выпустить эксклюзивную блокировку в таблице MYISAM.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top