时间戳范围为的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
必须遍历每一行才能得到该数字。因此,如果对大型列族(表)运行该操作,则将超时
注意:如果您发现您