时间戳范围为的SELECT请求中出现超时错误 我的情况如下: VPS服务器: 1卡桑德拉数据库: 键空间:“atim_云” 表:“信息” 创建表atim_cloud.messages( deviceid文本, 频道名称文本, 时间戳, AVG信号浮动, 纬度浮动, 经度浮动, rssi浮动, 信噪比浮动, stationid文本, 价值点, valuetype文本, 主键((deviceid,channelname),时间) )使用聚类顺序(时间描述) 布卢姆过滤器概率=0.01 和缓存=“{”键“:“所有”,“每个分区的行“:“无”}” 和注释=“” 压缩={'min_threshold':'4','class':'org.apache.cassandra.db.compression.SizeTieredCompactionStrategy','max_threshold':'32'} 压缩={'sstable_compression':'org.apache.cassandra.io.compress.LZ4Compressor'} 和dclocal\u read\u repair\u chance=0.1 并且默认的\u time\u to\u live=0 gc_grace_秒=864000 最大指数间隔=2048 和memtable_flush_period_in_ms=0 最小索引间隔=128 并读取_repair_chance=0.0 推测性_重试='99.0百分位'; 在atim_cloud.messages(deviceid)上创建索引消息\u deviceid\u idx; 在atim_cloud.messages(channelname)上创建索引消息\u channelname\u idx; 在atim_cloud.messages(time)上创建索引消息\u time_idx; 我的问题是:

时间戳范围为的SELECT请求中出现超时错误 我的情况如下: VPS服务器: 1卡桑德拉数据库: 键空间:“atim_云” 表:“信息” 创建表atim_cloud.messages( deviceid文本, 频道名称文本, 时间戳, AVG信号浮动, 纬度浮动, 经度浮动, rssi浮动, 信噪比浮动, stationid文本, 价值点, valuetype文本, 主键((deviceid,channelname),时间) )使用聚类顺序(时间描述) 布卢姆过滤器概率=0.01 和缓存=“{”键“:“所有”,“每个分区的行“:“无”}” 和注释=“” 压缩={'min_threshold':'4','class':'org.apache.cassandra.db.compression.SizeTieredCompactionStrategy','max_threshold':'32'} 压缩={'sstable_compression':'org.apache.cassandra.io.compress.LZ4Compressor'} 和dclocal\u read\u repair\u chance=0.1 并且默认的\u time\u to\u live=0 gc_grace_秒=864000 最大指数间隔=2048 和memtable_flush_period_in_ms=0 最小索引间隔=128 并读取_repair_chance=0.0 推测性_重试='99.0百分位'; 在atim_cloud.messages(deviceid)上创建索引消息\u deviceid\u idx; 在atim_cloud.messages(channelname)上创建索引消息\u channelname\u idx; 在atim_cloud.messages(time)上创建索引消息\u time_idx; 我的问题是:,cassandra,cql,cqlsh,Cassandra,Cql,Cqlsh,此表是为大量数据(数百万行)而创建的。 简单的请求可以很好地工作,如: 从deviceid='1DB8D'所在的消息中选择*; 我得到: deviceid | channelname | time | avgsignal |纬度|经度| rssi | snr | stationid | value | valuetype ----------+-------------+--------------------------+-----------+----------+-----------+

此表是为大量数据(数百万行)而创建的。 简单的请求可以很好地工作,如:

从deviceid='1DB8D'所在的消息中选择*;
我得到:

deviceid | channelname | time | avgsignal |纬度|经度| rssi | snr | stationid | value | valuetype
----------+-------------+--------------------------+-----------+----------+-----------+--------+-------+-----------+------------+-----------
1DB8D | INDEX1 | 2015-07-26 22:21:59+0200 | 9.9 | 45 | 6 |-125.5 | 9.66 | 0E00 | 0x00000000 | int
1DB8D | INDEX1 | 2015-07-26 22:11:58+0200 | 9.89 | 45 | 6 |-125.5 | 9.85 | 0E00 | 0x00000000 | int
1DB8D | INDEX1 | 2015-07-26 22:01:59+0200 | 9.87 | 45 | 6 |-123.5 | 10.08 | 0E00 | 0x00000000 | int
1DB8D | INDEX1 | 2015-07-26 21:51:59+0200 | 9.83 | 45 | 6 |-125.5 | 9.8 | 0E00 | 0x00000000 | int
1DB8D | INDEX1 | 2015-07-26 21:41:59+0200 | 9.83 | 45 | 6 |-124.5 | 10.02 | 0E00 | 0x00000000 | int
1DB8D | INDEX1 | 2015-07-26 21:31:58+0200 | 9.8 | 45 | 6 |-126.5 | 10.35 | 0E00 | 0x00000000 | int
1DB8D | INDEX1 | 2015-07-26 21:21:59+0200 | 9.78 | 45 | 6 |-122.5 | 9.91 | 0E00 | 0x00000000 | int
1DB8D | INDEX1 | 2015-07-26 21:11:59+0200 | 9.82 | 45 | 6 |-130.5 | 8.85 | 0E00 | 0x00000000 | int
1DB8D | INDEX1 | 2015-07-26 21:01:59+0200 | 9.79 | 45 | 6 |-129.5 | 10.11 | 0E00 | 0x00000000 | int
1DB8D | INDEX1 | 2015-07-26 20:51:58+0200 | 9.77 | 45 | 6 |-124.5 | 10.06 | 0E00 | 0x00000000 | int
1DB8D | INDEX1 | 2015-07-26 20:41:59+0200 | 9.78 | 45 | 6 |-123.5 | 9.52 | 0E00 | 0x00000000 | int
但当我使用时间戳的计算执行更复杂的请求时,如: (这种情况会发生几次,但不是每次都会发生)

从deviceid='1DB8D'和time>=1437981692831 LIMIT 500允许过滤的消息中选择*;
或者简单地说:

从消息中选择COUNT(*);
我得到(几秒钟后,我想是超时):

errors={},last_host=127.0.0.1
你有什么建议来解决我的问题吗? 我正在寻找一些关于索引或主键的建议,但我没有找到任何东西

如果您有一些执行此数据表的技巧,我很高兴听到。多集群呢?我不完全了解这件事


谢谢;)

二级索引仅建议用于基数较低的字段。对于基数较高的字段(如时间字段),它们的效率非常低。这就是为什么在查询中使用时间字段时会出现超时错误


在Cassandra中,您应该专注于使用好的主键,而不是通过创建辅助键来解决模式问题。

只是为了回应Jim所说的,但是辅助索引并不是真正用来解决数据模型缺陷的“魔弹”。您需要做的是围绕查询构建数据模型

只是好奇,但是
channelname
是用来做什么的?您将其作为分区键,但看起来您确实不想使用它进行查询。您是否将其用作“bucket”,以帮助将每个分区的列数保持在20亿以下?还是仅仅为了额外的独特性

假设您不需要将其作为“bucket”,如果我将您的主键重新构造为:

PRIMARY KEY (deviceid, time, channelname)
SELECT * FROM messages WHERE deviceid ='1DB8D' AND datebucket='20150726';
然后,该查询工作:

aploetz@cqlsh:stackoverflow2> SELECT * FROM messages WHERE deviceid ='1DB8D';

 deviceid | time                     | channelname | avgsignal | latitude | longitude | rssi   | snr   | stationid | value      | valuetype
----------+--------------------------+-------------+-----------+----------+-----------+--------+-------+-----------+------------+-----------
    1DB8D | 2015-07-26 15:21:59-0500 |      INDEX1 |       9.9 |       45 |         6 | -125.5 |  9.66 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 15:11:58-0500 |      INDEX1 |      9.89 |       45 |         5 | -125.5 |  9.85 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 15:01:59-0500 |      INDEX1 |      9.87 |       45 |         5 | -123.5 | 10.08 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 14:51:59-0500 |      INDEX1 |      9.83 |       45 |         5 | -125.5 |   9.8 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 14:41:59-0500 |      INDEX1 |      9.83 |       45 |         5 | -124.5 | 10.02 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 14:31:58-0500 |      INDEX1 |       9.8 |       45 |         5 | -126.5 | 10.35 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 14:21:59-0500 |      INDEX1 |      9.78 |       45 |         5 | -122.5 |  9.91 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 14:11:59-0500 |      INDEX1 |      9.82 |       45 |         5 | -130.5 |  8.85 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 14:01:59-0500 |      INDEX1 |      9.79 |       45 |         5 | -129.5 | 10.11 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 13:51:58-0500 |      INDEX1 |      9.77 |       45 |         5 | -124.5 | 10.06 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 13:41:59-0500 |      INDEX1 |      9.78 |       45 |         5 | -123.5 |  9.52 |      0E00 | 0x00000000 |       int

(11 rows)
就像这一个:

aploetz@cqlsh:stackoverflow2> SELECT * FROM messages WHERE deviceid ='1DB8D' AND time >='2015-07-26 14:00:00-0500';

 deviceid | time                     | channelname | avgsignal | latitude | longitude | rssi   | snr   | stationid | value      | valuetype
----------+--------------------------+-------------+-----------+----------+-----------+--------+-------+-----------+------------+-----------
    1DB8D | 2015-07-26 15:21:59-0500 |      INDEX1 |       9.9 |       45 |         6 | -125.5 |  9.66 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 15:11:58-0500 |      INDEX1 |      9.89 |       45 |         5 | -125.5 |  9.85 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 15:01:59-0500 |      INDEX1 |      9.87 |       45 |         5 | -123.5 | 10.08 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 14:51:59-0500 |      INDEX1 |      9.83 |       45 |         5 | -125.5 |   9.8 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 14:41:59-0500 |      INDEX1 |      9.83 |       45 |         5 | -124.5 | 10.02 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 14:31:58-0500 |      INDEX1 |       9.8 |       45 |         5 | -126.5 | 10.35 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 14:21:59-0500 |      INDEX1 |      9.78 |       45 |         5 | -122.5 |  9.91 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 14:11:59-0500 |      INDEX1 |      9.82 |       45 |         5 | -130.5 |  8.85 |      0E00 | 0x00000000 |       int
    1DB8D | 2015-07-26 14:01:59-0500 |      INDEX1 |      9.79 |       45 |         5 | -129.5 | 10.11 |      0E00 | 0x00000000 |       int

(9 rows)
更重要的是,它们在没有辅助索引或
ALLOW FILTERING
指令的情况下工作。这个主键还支持完整的分区键(
deviceid
)查询,因此这些查询应该运行良好

从消息中选择计数(*)

是的,
COUNT
的Cassandra/CQL实现的性能远不如RDBMS/SQL。苹果的Richard Low(和DataStax MVP)写了一篇文章(“”),讲述了
COUNT
如何“在引擎盖下”工作,这绝对值得一读。本质上,
COUNT
必须遍历每一行才能得到该数字。因此,如果对大型列族(表)运行该操作,则将超时

注意:如果您发现您