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

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

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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

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