2015-05-23 3 views
3

Я изучаю cassandra как возможное решение для моего предстоящего проекта. Чем больше я исследую, тем больше я слышу, что плохой идеей сортировать поля, которые не настраиваются для сортировки при создании таблицы.Закажите любое поле в Cassandra

Можно ли сортировать по любому полю? Если влияние сортировки на поля, не входящие в кластер, влияет на производительность, что влияет на производительность? Мне нужно сортировать около 2 миллионов записей в таблице.

ответ

8

Я продолжаю слышать, что это плохая идея сортировать поля, которые не настроены для сортировки при создании таблицы.

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

Можно ли сортировать по любому полю?

Это то, как Cassandra сортирует результирующие наборы: это не так. Запросы Cassandra соответствуют местоположениям разделов, и данные считываются с диска и возвращаются вам. Если данные считываются в том же порядке, что и сортировка на диске, набор результатов будет отсортирован. С другой стороны, если вы попробуете запрос с несколькими ключами или запрос на основе индекса, где он должен перескакивать на разные разделы, скорее всего, он не будет возвращен ни в каком значимом порядке.

Но если вы планируете заранее, вы можете реально повлиять на порядок сортировки на диске ваших данных и затем использовать этот порядок в своих запросах. Это можно сделать с помощью механизма моделирования, называемого «столбцом кластеризации». Cassandra позволит вам указать несколько столбцов кластеризации, но они действительны только в одном разделе.

Так что это значит? Возьмите this example from the DataStax documentation.

CREATE TABLE playlists (
    id uuid, 
    artist text, 
    album text, 
    title text, 
    song_order int, 
    song_id uuid, 
    PRIMARY KEY ((id),song_order)) 
WITH CLUSTERING ORDER BY (song_order ASC); 

С этим определением таблицы, я могу запросить частности playlist по id (ключ раздела). В каждом id, данные будут возвращены по заказу song_order:

SELECT id, song_order, album, artist, title 
FROM playlists WHERE id = 62c36092-82a1-3a00-93d1-46196ee77204 
ORDER BY song_order DESC; 

id         | song_order | album     | artist   | title 
------------------------------------------------------------------------------------------------------------------ 
62c36092-82a1-3a00-93d1-46196ee77204 | 4   | No One Rides For Free |  Fu Manchu |    Ojo Rojo  
62c36092-82a1-3a00-93d1-46196ee77204 | 3   |    Roll Away | Back Door Slam | Outside Woman Blues 
62c36092-82a1-3a00-93d1-46196ee77204 | 2   |   We Must Obey |  Fu Manchu |  Moving in Stereo 
62c36092-82a1-3a00-93d1-46196ee77204 | 1   |   Tres Hombres |   ZZ Top |   La Grange 

В этом примере, если мне нужно только указать ORDER BY, если я хочу, чтобы изменить направление сортировки. Поскольку строки хранятся в ASC окончательном порядке, мне нужно указать DESC, чтобы увидеть их в DESC окончание заказа. Если бы я был в порядке с возвращением строк в ASC, то мне не нужно указывать ORDER BY.

Но что, если я хочу заказать по исполнителю? Или альбом? Или оба?Так как один художник может иметь много альбомов (для этого примера), мы будем изменять PRIMARY KEY определение так:

PRIMARY KEY ((id),artist,album,song_order) 

Запуск же запрос выше (минус ORDER BY) производит этот выход:

SELECT id, song_order, album, artist, title 
FROM playlists WHERE id = 62c36092-82a1-3a00-93d1-46196ee77204; 

id         | song_order | album     | artist   | title 
------------------------------------------------------------------------------------------------------------------ 
62c36092-82a1-3a00-93d1-46196ee77204 | 3   |    Roll Away | Back Door Slam | Outside Woman Blues 
62c36092-82a1-3a00-93d1-46196ee77204 | 4   | No One Rides For Free |  Fu Manchu |    Ojo Rojo  
62c36092-82a1-3a00-93d1-46196ee77204 | 2   |   We Must Obey |  Fu Manchu |  Moving in Stereo 
62c36092-82a1-3a00-93d1-46196ee77204 | 1   |   Tres Hombres |   ZZ Top |   La Grange 

Обратите внимание, что строки теперь упорядочиваются по artist, а затем album. Если бы у нас было две песни из того же альбома, тогда будет song_order.

Итак, теперь вы можете спросить «что, если я просто хочу сортировать по album, а не artist?» Вы можете сортировать только по album, но не с этой таблицей. Вы не можете пропустить ключи кластеризации в предложении ORDER BY. Чтобы отсортировать только по album (а не artist), вам нужно создать другую таблицу запросов. Иногда моделирование данных Cassandra позволит вам дублировать ваши данные несколько раз, чтобы иметь возможность обслуживать разные запросы ... и все нормально.

Более подробно о том, как строить модели данных, используя при этом порядок кластеризации, проверить эти две статьи на PlanetCassandra:

Смежные вопросы