Возможно, это решение может быть принято позже, если и только если проблемы с производительностью действительно появятся. Это очень сильно зависит от того, сколько строк добавлено с какой скоростью, спецификации вашего бокса и т. Д. Очевидно, что уровень абстракции в вашем приложении (и ограничения любых библиотек, которые вы используете) поможет определить, насколько сложным будет такое изменение. .
Если это станет проблемой, или вы уверены, что это произойдет, начните с разбиения по удаленному флагу между двумя таблицами, одна из которых содержит текущие данные, а другая - исторические / удаленные данные. Если, как вы сказали, «удаленные» данные будут доступны только администраторам, разумно предположить, что (в большинстве приложений) общее количество пользователей (в данном случае только администраторов) будет недостаточным для возникновения проблемы. Это означает, что вашим администраторам может потребоваться немного подождать при поиске в этой конкретной таблице, но ваша пользовательская база (возможно, более важная в большинстве приложений) будет испытывать гораздо меньшую задержку. Если производительность становится неприемлемой для администраторов, вы, вероятно, захотите проиндексировать поле user_id (илиaction_id или что-то еще), к которому вы обращаетесь к удаленным записям (я обычно индексирую каждое поле, к которому я получаю доступ к таблице, но в определенном масштабе может происходить торговля о том, какие индексы наиболее полезны).
В зависимости от того, как осуществляется доступ к данным, есть и другие простые приемы, которые вы можете использовать. Если администратор ищет определенную запись большую часть времени (в отличие, скажем, от чтения «истории» или «журнала» активности пользователя), часто можно предположить, что более свежие записи будут просматриваться чаще, чем старые записей. В некоторых БД есть опции настройки для облегчения поиска последних записей, чем для более старых записей, но вам придется искать их в вашей конкретной базе данных. В противном случае вы можете сделать это вручную. Самый простой способ - это иметь таблицу Ancient_history, которая содержит все записи старше n дней, недель или месяцев, в зависимости от ваших ограничений и предполагаемых моделей использования. Более новые данные тогда живут в намного меньшей таблице. Даже если администратор собирается «просмотреть» все записи, а не искать конкретную, вы можете начать с показа первых n дней и иметь ссылку для просмотра всех дней, если они не найдут то, что они ищут (например, большинство приложений для онлайн-банкинга, которые позволяют просматривать транзакции, но отображают только первые 30 дней истории, если вы не запросите иное.)
Надеюсь, вы можете избежать дальнейших шагов, а также разделить имя_пользователя или какую-либо другую схему. В зависимости от масштаба остальной части вашего приложения, вам, возможно, придется сделать это в любом случае. Если вы не уверены, что вам это понадобится, я настоятельно рекомендую сначала использовать вертикальное разбиение (например, хранить ваши forum_posts на отдельном компьютере, а не sales_records), так как это намного проще в настройке и обслуживании. Если вам в конечном итоге понадобится шард на user_id, я предлагаю использовать Google; -]
Удачи. Кстати, я не администратор баз данных, поэтому возьмите это с крошкой соли.