Представление Кассандры о первом ключе кластеризации - PullRequest
0 голосов
/ 12 мая 2018

Я использую Cassandra 3.x и у меня есть следующая таблица:

CREATE TABLE sp_db.prod_tag 
(
    year int,
    name text,
    group int,
    sn text,
    factory_id bigint,
    PRIMARY KEY ((year), name, group)
) WITH CLUSTERING ORDER BY (name ASC, group ASC);

Я вставил 1 миллион строк и начал выполнять запросы:

Запрос # 1 - на разделеключ

select count(*) 
from sp_db.prod_tag  
where year = 2015;

Вывод:

    count |
    ------|
    33328 |

Время запроса: ~ 90 мс

Запрос № 2 - один из ключей кластеризации

select count(*) 
from sp_db.prod_tag 
where group = 104 ALLOW FILTERING;

Результат:

    count |
    ------|
    3938  |

Время запроса: ~ 800 мс

Мы не передаем первичный ключ, поэтому Кассандра получает все строки из таблицыи это влияет на производительность.

Пока все хорошо ...

Первый запрос ключа кластеризации:

select count(*) 
from sp_db.prod_tag 
where name = '06d7d' ALLOW FILTERING;

Результаты:

    count |
    ------|
    3     |

Время запроса: ~ 6ms

И вот мое удивление: почему только 6ms?Первичного ключа нет, поэтому этот запрос должен иметь низкую производительность.

Изучая документацию Я не нашел ответа.

Может кто-нибудь объяснить это?

1 Ответ

0 голосов
/ 12 мая 2018

Нет конкретной причины, по которой запрос на name должен быть быстрее, чем запрос на group, при условии, что у вас нет вторичного индекса на name.

Я подозреваю, но не могу доказать,что это в первую очередь результат кеширования на разных уровнях (включая кеш страниц ОС).

Редактировать: перечитать схему

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

...