Кассандра индексирует несколько столбцов - PullRequest
0 голосов
/ 05 декабря 2018

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

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

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

РЕДАКТИРОВАТЬ1: представление моей таблицы cassandra доступно по этой ссылке , представленной в виде Java-класса.Я должен сделать запрос, используя, где col1 = 'val1' и col2 = 'val2' и col3 = 'val3'

EDIT2: я действительно думал о создании нового столбца с данными col1,2,3 что-то вроде newcol= 'val1val2val3', поэтому я могу создать отдельный вторичный индекс для newcol и покончить с этой загадкой, но это скорее хак, чем стратегический.Любые комментарии по этому плану будут оценены.PS: у этого newcol будет средняя мощность.

EDIT3: я нашел хорошую информацию о вторичных индексах и позволил фильтровать здесь , что, кажется, помогает

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

В качестве наихудшего варианта для вашего варианта использования рассмотрите возможность поиска австрийского композитора, родившегося в 1756 году. Да, вы можете найти его (Моцарта) в таблице всех людей, которые когда-либо жили, пересекая индекс национальности = Австрия, индексрождения = 1756 и индекс профессии = композитор.Но Cassandra будет реализовывать такой запрос очень неэффективно - либо нужно извлечь огромные списки и пересечь их, либо, на самом деле, извлечь только один огромный список (например, список всех австрийцев, которые когда-либо жили), а затем отфильтровать их в соответствии сдругие критерии (рождение и профессия).Вот почему вам нужно "разрешить фильтрацию".И почему это не рекомендуемый вариант использования для исходного Вторичного индекса Кассандры.

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

Как вы, возможно, знаете, Cassandra имеет реализацию вторичного индекса second ,известный как SASI.SASI (см. https://github.com/apache/cassandra/blob/trunk/doc/SASI.md) имеет много ориентированных на поисковую систему улучшений по сравнению с первоначальной реализацией вторичного индекса Cassandra, и, если я правильно понимаю (я никогда не пробовал себя), эффективные пересечения являются одной из этих функций. Поэтому, возможно, переключение на SASIхорошая идея в вашем случае использования.

0 голосов
/ 05 декабря 2018

1) Ты должен быть.Я настоятельно рекомендую избегать вторичных индексов и РАЗРЕШИТЬ ФИЛЬТРАЦИЮ рассматривать их как расширенные возможности для угловых случаев.

2) С индексом это может быть более эффективным, но все же ужасным, а также ужасным в более новых направлениях.Существует всего несколько сценариев, в которых допустимы вторичные индексы.Существует очень немного сценариев, в которых разрешено использование РАЗРЕШЕНИЯ НА ФИЛЬТР.Вы смотрите на совпадение двух.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...