Для RediSearch, лучше ли создать один индекс или несколько индексов?

Я создаю Индекс с использованием RediSearch в мультитенантном приложении, которое имеет:

  • 150000 арендаторов
  • Каждый арендатор имеет в среднем 3500 клиентов
  • У каждого клиента есть 10 полей, которые будут добавлены в индекс
  • Все поля TextFields,

Вопрос в том, что было бы лучше в этом случае (производительность, память / память, гибкость)?

Должен ли я создать один customer_index с tenant_code поле, помогающее определить, какие данные принадлежат какому арендатору или мне следует создать специальный индекс для арендатора?

Исходя из моего текущего опыта и понимания, индекс конкретного арендатора будет означать много индексов, но с меньшим количеством данных в них, а также даст мне возможность отбросить и воссоздать индекс для конкретного арендатора?

В Python код будет выглядеть следующим образом:

Индекс одного клиента

client = Client(`customer_index`)
client.create_index(
            [
                TextField('tenant_code'), TextField('last_name'), TextField('first_name'),
                TextField('other_name'), 
            ]
        )   

Индекс клиента конкретного арендатора

client = Client(`tenant_code_customer_index`)
client.create_index(
            [
                TextField('last_name'), TextField('first_name'), TextField('other_name'), 
            ]
        )

1 ответ

Решение

Поскольку у каждого арендатора всего 3500 клиентов (относительно мало), вам лучше использовать память, используя больший индекс. При таком небольшом количестве записей затраты ресурсов для каждого индекса, вероятно, превысят размер самого индекса. Это также увеличит количество ключей в самом Redis, так как новый ключ Redis создается для каждого индексируемого термина для каждого индекса. Таким образом, если у вас есть ~2000 уникальных терминов в каждой БД, вы получите 300 миллионов ключей Redis (2k * 150k). Напротив, использование одного индекса оставит вам только 2 тыс. Ключей.

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

Для удаления вы можете просто собрать список идентификаторов, которые соответствуют критериям, например "FT.SEARCH idx @tenant:yourcodeи позвоните FT.DEL на каждой из этих записей в отдельности. Я предполагаю, что это не операция, которая выполняется каждые пять секунд, поэтому вы должны быть там.

Обратите внимание, что использование 150 тыс. Индексов в настоящее время, вероятно, даже невозможно, поскольку для каждого индекса создается отдельный поток индексации (хотя в будущих выпусках будет доступна опция индексирования в одном потоке).

Другие вопросы по тегам