2009-06-26 4 views
3

У меня есть база данных, где у большинства таблиц есть флаг удаления для таблиц. Таким образом, система soft удаляет элементы (поэтому они больше недоступны, если только администраторами)Как я могу исправить эту проблему масштабирования при мягком удалении элементов?

Что меня беспокоит за несколько лет, когда таблицы намного больше, так это то, что общая скорость системы будет быть уменьшенным.

Что я могу сделать для противодействия таким эффектам.

  • Я указываю поле удаления?
  • Переместить удаленные данные в идентичную таблицу удаления и обратно при восстановлении?
  • С распространением данных на нескольких серверах MySQL с течением времени? (на основе роста)

Буду признателен за любые предложения или истории.

UPDATE:

Так разделение, кажется, ключ к этому. Но не будет ли разделение просто создавать две «таблицы», одну с удаленными элементами и одну без удаленных элементов.

Так с течением времени удаленный раздел будет расти большими и иногда получений фидов из него будет медленным (и медленнее с течением времени)

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

ответ

4

Я разделил бы таблицу на флаг DELETE.

Удаленные строки будут физически сохранены в другом месте, но с точки зрения SQL таблица остается неизменной.

+0

Это довольно интересный момент. Я не знал этого :) –

+0

@Olafur: http://dev.mysql.com/doc/refman/5.1/ru/partitioning-list.html – Quassnoi

+0

Спасибо. –

4

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

+0

Да, на самом деле существует несколько запросов, которые не проверяют поле удаления для некоторого значения. –

+0

Право; Я на самом деле не имел в виду буквально «все время», скорее «очень часто». Если большинство ваших запросов идут против поля удаления, это, безусловно, вызывает индексацию. – chaos

1

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

Если это проблема, или вы уверены, что это произойдет, начните с разбиения на удаленный флаг между двумя таблицами, в котором хранятся текущие данные, и те, которые содержат исторические/удаленные данные. ЕСЛИ, как вы сказали, «удаленные» данные будут доступны только администраторам, разумно предположить, что (в большинстве приложений) общее количество пользователей (ограничено только администраторами) не будет достаточным, чтобы вызвать проблему. Это означает, что вашим администраторам, возможно, потребуется немного подождать, когда вы будете искать эту конкретную таблицу, но ваша пользовательская база (возможно, более важная в большинстве приложений) будет испытывать гораздо меньшую задержку. Если производительность становится неприемлемой для администраторов, вы, скорее всего, захотите индексировать поле user_id (или transaction_id или другое), к которому вы обращаетесь к удаленным записям, (я обычно индексирую каждое поле, по которому я обращаюсь к таблице, но в определенном масштабе может быть торговля - о том, какие индексы наиболее ценны).

В зависимости от доступа к данным существуют и другие простые трюки, которые вы можете использовать. Если администратор ищет большую конкретную запись (в отличие от, скажем, чтения «истории» или «регистрации» активности пользователя), часто можно предположить, что более поздние записи будут рассмотрены чаще, чем старые записей. Некоторые БД включают в себя параметры настройки для облегчения поиска последних записей, чем старые записи, но вам придется искать их для вашей конкретной базы данных. В противном случае вы можете вручную это сделать. Самый простой способ - иметь таблицу old_history, содержащую все записи старше n дней, недель или месяцев, в зависимости от ваших ограничений и предполагаемых шаблонов использования. Более новые данные затем живут в гораздо меньшей таблице. Даже если администратор собирается «просматривать» все записи, а не искать конкретную, вы можете начать с отображения первых n дней и иметь ссылку, чтобы увидеть все дни, если они не найдут то, что они ищут (например, большинство онлайн-банковских приложений, которые позволяют просматривать транзакции, но показывают только первые 30 дней истории, если вы не запросите иное.)

Надеюсь, вы можете избежать необходимости делать шаг дальше и окутывать user_id или какую-либо такую ​​схему. В зависимости от масштаба остальной части вашего приложения вам все равно придется это делать. Если вы не уверены, что вам это нужно, я настоятельно рекомендую сначала использовать вертикальное разбиение (например, сохранить ваши forum_posts на отдельной машине, чем ваши sales_records), так как FAR легче настроить и поддерживать. Если вам нужно очертить user_id, я предлагаю использовать google; -]

Удачи. Кстати, я не DBA, поэтому возьмите это с солью.

+0

Очень хороший ответ, спасибо :) –