Является ли отношение IN в Кассандре плохим для запросов?

На примере следующего выбора в CQL:

SELECT * FROM tickets WHERE ID IN (1,2,3,4) 

Данный идентификатор является ключом раздела, использует отношение IN лучше, чем выполнение нескольких запросов, или нет разницы?

Я вспомнил, что кто-то ответил на этот вопрос в списке рассылки пользователей Cassandra некоторое время назад, но я не могу найти точное сообщение прямо сейчас. По иронии судьбы, евангелист Кассандры Ребекка Миллс опубликовала статью, в которой рассматривается эта проблема ( Вещи, которые вы должны делать при использовании драйверов Cassandra … пункты № 13 и № 22). Но ответ «да», что в некоторых случаях несколько параллельных запросов будут быстрее, чем использование IN . Основная причина может быть найдена в документации DataStax SELECT .

Когда не использовать IN

… Использование IN может ухудшить производительность, потому что обычно нужно запрашивать множество узлов. Например, в одном локальном кластере центров обработки данных с 30 узлами, коэффициенте репликации 3 и уровне согласованности LOCAL_QUORUM, один ключевой запрос выходит на два узла, но если в запросе используется условие IN, количество запрашиваемые узлы, скорее всего, еще выше, до 20 узлов в зависимости от того, где ключи попадают в диапазон токенов.

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

Поэтому наилучшим способом решить эту проблему (и вообще не использовать IN ) было бы переосмыслить вашу модель данных для этого запроса. Не зная слишком много о вашей схеме, возможно, есть атрибуты (значения столбцов), которые разделяются идентификаторами билетов 1, 2, 3 и 4. Возможно, используя что-то вроде уровня или группы (если билеты предназначены для определенного места) или, возможно, даже событие (id), вместо этого.

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

Да, лучше спросить индивидуально, чем использовать IN в Кассандре.

Для этого запроса координатор должен получить данные из 4 разных разделов, и если каждый раздел очень велик, данные заполняются в JVM, что может вызвать проблемы.

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

Interesting Posts
Давайте будем гением компьютера.