Я хочу построить кластер для хранения данных журналов. В каждом документе есть несколько полей, но это ключевые:
- user_id (средняя мощность)
- идентификатор (это имеет чрезвычайно высокую мощность, но не гарантируется, что она будет уникальной для пользователей, это может быть UP C например)
- канал (низкая мощность)
- временная метка
Ожидается, что в коллекции будет более 1 миллиарда документов, поэтому сегментирование и производительность здесь важны.
Теперь почти все высокочастотные запросы к коллекции будут иметь user_id
, потому что журналы отображаются в пользовательском интерфейсе для каждого пользователя уникально. Большинство запросов будет на user_id
+ identifier
. Некоторые запросы будут ограничены по времени. В некоторых запросах также используется channel
, но не во всех. user_id
- это монотонно увеличивающееся поле.
Я хочу разбить на hashed(user_id)
. Один идеальный индекс - {"user_id": 1, "identifier": 1, "timestamp": 1}
, поэтому я его и сделал. Я пробовал шардинг на hashed(user_id)
, но в данном случае это не сработало, и я понял, что user_id
должен быть того же типа. Однако создание индекса {"user_id": "hashed", "identifier": 1, "timestamp": 1}
также невозможно, поскольку составные ключи с ha sh запрещены.
Какой мой лучший вариант здесь?
- создать один индекс с просто
hashed(user_id)
, чтобы я мог разделить его, а затем еще один индекс с {"user_id": 1, "identifier": 1, "timestamp": 1}
? Я бы понес штраф за хранение здесь. - не иметь sh
user_id
, даже если он монотонно увеличивается, а вместо этого разбивается на {"user_id": 1, "identifier": 1}
? Не уверен, есть ли здесь недостатки по сравнению с простым шардингом на hashed(user_id)
- какой-то другой вариант?