Может ли Cassandra кешировать строки только кеш на определенные столбцы? - PullRequest
0 голосов
/ 04 января 2019

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

Схема выглядит следующим образом:

CREATE TABLE tb1 (
    pk1 int,
    ck1 int,
    read_heavy_col1 int,
    read_heavy_col2 int,
    normal_col1 int,
    normal_col2 int,
    ...
    PRIMARY KEY (pk1, ck1)
)

Вопрос в том,если кеш строк способен кешировать только pk1, ck1, read_heavy_col1, read_heavy_col2 и игнорирует normal_col1, normal_col2, ....

в соответствии с DataStax Настройка кэшей данных ,

Если недавно кэшированные данныене включает все ячейки, настроенные пользователем, Кассандра выполняет еще одно чтение.

Означает ли это, что C * может кэшировать только интересующие столбцы?

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Отвечая на мои собственные вопросы: Кассандра будет кэшировать все столбцы этой строки.

Из «Руководства Кассандры» (2-е издание) Джеффа Карпентера и Эбена Хьюитта:

Кэш строк кэширует целые строки и может ускорить доступ для чтения к часто используемым строкам за счет увеличения использования памяти.

Эксперимент:

abc@cqlsh:test> SELECT pk1, ck1, read_heavy_col1 FROM tb1 WHERE pk1=2 and ck1=1;

 pk1 | ck1 | read_heavy_col1
-----+-----+-----------------
   2 |   1 |               1

(1 rows)

Tracing session: 53aac630-11be-11e9-9cb3-fbffb1c1e13b

 activity                                                                                               | timestamp                  | source       | source_elapsed
--------------------------------------------------------------------------------------------------------+----------------------------+--------------+----------------
                                                                                     Execute CQL3 query | 2019-01-06 22:21:15.667000 | x.x.x.x |              0
 Parsing SELECT pk1, ck1, read_heavy_col1 FROM tb1 WHERE pk1=2 and ck1=1; [Native-Transport-Requests-1] | 2019-01-06 22:21:15.668000 | x.x.x.x |            310
                                                      Preparing statement [Native-Transport-Requests-1] | 2019-01-06 22:21:15.668000 | x.x.x.x |            568
                                                Executing single-partition query on roles [ReadStage-2] | 2019-01-06 22:21:15.669000 | x.x.x.x |           1259
                                                             Acquiring sstable references [ReadStage-2] | 2019-01-06 22:21:15.669000 | x.x.x.x |           1345
                                                              Key cache hit for sstable 2 [ReadStage-2] | 2019-01-06 22:21:15.669000 | x.x.x.x |           1475
                Skipped 0/1 non-slice-intersecting sstables, included 0 due to tombstones [ReadStage-2] | 2019-01-06 22:21:15.669000 | x.x.x.x |           1569
                                                Merged data from memtables and 1 sstables [ReadStage-2] | 2019-01-06 22:21:15.669000 | x.x.x.x |           1768
                                                   Read 1 live rows and 0 tombstone cells [ReadStage-2] | 2019-01-06 22:21:15.669000 | x.x.x.x |           1869
                                                Executing single-partition query on roles [ReadStage-3] | 2019-01-06 22:21:15.672000 | x.x.x.x |           4579
                                                             Acquiring sstable references [ReadStage-3] | 2019-01-06 22:21:15.672000 | x.x.x.x |           4701
                                                              Key cache hit for sstable 2 [ReadStage-3] | 2019-01-06 22:21:15.672000 | x.x.x.x |           4812
                Skipped 0/1 non-slice-intersecting sstables, included 0 due to tombstones [ReadStage-3] | 2019-01-06 22:21:15.672000 | x.x.x.x |           4891
                                                Merged data from memtables and 1 sstables [ReadStage-3] | 2019-01-06 22:21:15.672000 | x.x.x.x |           5001
                                                   Read 1 live rows and 0 tombstone cells [ReadStage-3] | 2019-01-06 22:21:15.673000 | x.x.x.x |           5081
                                                                           Row cache miss [ReadStage-3] | 2019-01-06 22:21:15.674000 | x.x.x.x |           6227
                                                  Executing single-partition query on tb1 [ReadStage-3] | 2019-01-06 22:21:15.674000 | x.x.x.x |           6387
                                                             Acquiring sstable references [ReadStage-3] | 2019-01-06 22:21:15.674000 | x.x.x.x |           6445
                Skipped 0/0 non-slice-intersecting sstables, included 0 due to tombstones [ReadStage-3] | 2019-01-06 22:21:15.674001 | x.x.x.x |           6514
                                                                           Caching 3 rows [ReadStage-3] | 2019-01-06 22:21:15.674001 | x.x.x.x |           6647
                                                Merged data from memtables and 0 sstables [ReadStage-3] | 2019-01-06 22:21:15.675000 | x.x.x.x |           7231
                                                   Read 1 live rows and 0 tombstone cells [ReadStage-3] | 2019-01-06 22:21:15.675000 | x.x.x.x |           7443
                                                                                       Request complete | 2019-01-06 22:21:15.676482 | x.x.x.x |           9482

Затем строки кэшируютсявыборка обычного столбца: abc @ cqlsh: test> SELECT pk1, ck1, normal_col2 ОТ tb1 WHERE pk1 = 2 и ck1 = 1;

 pk1 | ck1 | normal_col2
-----+-----+-------------
   2 |   1 |           1

(1 rows)

Tracing session: a178ae90-11be-11e9-9cb3-fbffb1c1e13b

 activity                                                                                           | timestamp                  | source       | source_elapsed
----------------------------------------------------------------------------------------------------+----------------------------+--------------+----------------
                                                                                 Execute CQL3 query | 2019-01-06 22:23:26.201000 | x.x.x.x |              0
 Parsing SELECT pk1, ck1, normal_col2 FROM tb1 WHERE pk1=2 and ck1=1; [Native-Transport-Requests-1] | 2019-01-06 22:23:26.202000 | x.x.x.x |            205
                                                  Preparing statement [Native-Transport-Requests-1] | 2019-01-06 22:23:26.202000 | x.x.x.x |            393
                                            Executing single-partition query on roles [ReadStage-3] | 2019-01-06 22:23:26.202000 | x.x.x.x |            968
                                                         Acquiring sstable references [ReadStage-3] | 2019-01-06 22:23:26.203000 | x.x.x.x |           1413
                                                          Key cache hit for sstable 2 [ReadStage-3] | 2019-01-06 22:23:26.203000 | x.x.x.x |           1564
            Skipped 0/1 non-slice-intersecting sstables, included 0 due to tombstones [ReadStage-3] | 2019-01-06 22:23:26.203000 | x.x.x.x |           1685
                                            Merged data from memtables and 1 sstables [ReadStage-3] | 2019-01-06 22:23:26.203000 | x.x.x.x |           1841
                                               Read 1 live rows and 0 tombstone cells [ReadStage-3] | 2019-01-06 22:23:26.203000 | x.x.x.x |           1930
                                            Executing single-partition query on roles [ReadStage-5] | 2019-01-06 22:23:26.204000 | x.x.x.x |           2307
                                                         Acquiring sstable references [ReadStage-5] | 2019-01-06 22:23:26.204000 | x.x.x.x |           2375
                                                          Key cache hit for sstable 2 [ReadStage-5] | 2019-01-06 22:23:26.204000 | x.x.x.x |           2475
            Skipped 0/1 non-slice-intersecting sstables, included 0 due to tombstones [ReadStage-5] | 2019-01-06 22:23:26.204000 | x.x.x.x |           2584
                                            Merged data from memtables and 1 sstables [ReadStage-5] | 2019-01-06 22:23:26.204000 | x.x.x.x |           2691
                                               Read 1 live rows and 0 tombstone cells [ReadStage-5] | 2019-01-06 22:23:26.204000 | x.x.x.x |           2761
                                                                        Row cache hit [ReadStage-3] | 2019-01-06 22:23:26.205000 | x.x.x.x |           3301
                                               Read 1 live rows and 0 tombstone cells [ReadStage-3] | 2019-01-06 22:23:26.205000 | x.x.x.x |           3489
                                                                                   Request complete | 2019-01-06 22:23:26.204726 | x.x.x.x |           3726

Ясно, что C * будет кэшировать всю строку, а не конкретные столбцы.

0 голосов
/ 04 января 2019

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

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

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