Перевод данных/набора запросов MySQL в эквивалентное представление Cassandra

StackOverflow https://stackoverflow.com/questions/2413466

  •  19-09-2019
  •  | 
  •  

Вопрос

Рассмотрим таблицу MySQL на 500 миллионов строк со следующей структурой таблицы:

CREATE TABLE foo_objects (
  id int NOT NULL AUTO_INCREMENT,
  foo_string varchar(32),
  metadata_string varchar(128),
  lookup_id int,
  PRIMARY KEY (id),
  UNIQUE KEY (foo_string),
  KEY (lookup_id),
);

...который запрашивается с использованием только следующих двух запросов...

# lookup by unique string key, maximum of one row returned
SELECT * FROM foo_objects WHERE foo_string = ?;
# lookup by numeric lookup key, may return multiple rows
SELECT * FROM foo_objects WHERE lookup_id = ?;

Учитывая эти запросы, как бы вы представили данный набор данных с помощью Cassandra?

Это было полезно?

Решение

у вас есть два варианта:

(1) является своего рода традиционным:имейте один CF (семейство столбцов) с вашими объектами foo, одну строку для каждого foo, один столбец для каждого поля.затем создайте два индексных CF, где ключ строки в одном — это строковые значения, а ключ строки в другом — это Lookup_id.Столбцы в индексных строках являются идентификаторами продуктов.Итак, вы выполняете GET по индексу CF, затем MULTIGET по возвращаемым идентификаторам.

Обратите внимание: если вы можете сделать id таким же, как и Lookup_id, вам придется поддерживать на один индекс меньше.

Клиенты высокого уровня, такие как лентяй Дигга (http://github.com/digg/lazyboy) автоматизирует поддержание индексных CF для вас.Сама Cassandra не делает этого автоматически (пока).

(2) аналогичен (1), но вы дублируете все объекты foo в подстолбцы строк индекса (то есть столбцы верхнего уровня индекса являются суперстолбцами).Если вы на самом деле не выполняете запрос по самому идентификатору foo, вам вообще не нужно хранить его в собственном CF.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top