Как я могу исправить эту проблему масштабирования с мягким удалением элементов? - PullRequest
3 голосов
/ 26 июня 2009

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

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

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

  • Индексировать ли поле удаления?
  • Переместить ли удаленные данные в ту же самую таблицу удаления и обратно, если она была удалена?
  • Распределяю ли я данные по нескольким серверам MySQL с течением времени? (по росту)

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

UPDATE:

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

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

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

Ответы [ 3 ]

4 голосов
/ 26 июня 2009

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

4 голосов
/ 26 июня 2009

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

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

1 голос
/ 07 июля 2009

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

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

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

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

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

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