Перевод данных/набора запросов MySQL в эквивалентное представление Cassandra
Вопрос
Рассмотрим таблицу 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.