У меня есть таблица, определенная как:
Пространство ключей :
CREATE KEYSPACE messages WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;
Таблица :
CREATE TABLE messages.textmessages (
categoryid int,
date timestamp,
messageid timeuuid,
message text,
userid int,
PRIMARY KEY ((categoryid, date), messageid)
) WITH CLUSTERING ORDER BY (messageid ASC);
Цель состоит в том, чтобы иметь широкое хранилище временных рядов, чтобы categoryid
и date
(начало дня) составляли ключ моего раздела, а messageid
обеспечивает кластеризацию.Это позволяет мне выполнять запросы вроде:
SELECT * FROM messages.textmessages WHERE categoryid=2 AND date='2019-05-14 00:00:00.000+0300' AND messageId > maxTimeuuid('2019-05-14 00:00:00.000+0300') AND messageId < minTimeuuid('2019-05-15 00:00:00.000+0300')
для получения сообщений в определенный день;это работает так хорошо, так быстро!
Проблема
Мне нужно иметь возможность подсчитывать сообщения за определенный день, подставляя SELECT *
выше с SELECT COUNT(*)
.Это занимает очень много времени даже при чуть менее 100 000 записей в семействе столбцов;на самом деле время ожидания cqlsh
.
Я прочитал и понял довольно много, почему COUNT
является дорогой операцией для распределенной базы данных, такой как Cassandra, в Подсчет ключей?Также возможно считать звезды
Вопрос
Почему этот запрос занимает столько времени, даже если:
SELECT COUNT(*) FROM messages.textmessages WHERE categoryid=2 AND date='2019-05-14 00:00:00.000+0300' AND messageId > maxTimeuuid('2019-05-14 00:00:00.000+0300') AND messageId < minTimeuuid('2019-05-15 00:00:00.000+0300')
- Счетчик находится на определенном разделе с количеством записей менее 100 КБ
- У меня только один узел Cassandra на быстродействующем Macbook Pro
- Нет активных операций записи / чтения в экземпляре;менее 20 разделов на ноутбуке для разработчиков