我有一个如下所示的数据模型,
CREATE TABLE appstat.nodedata (
nodeip text,
timestamp timestamp,
flashmode text,
physicalusage int,
readbw int,
readiops int,
totalcapacity int,
writebw int,
writeiops int,
writelatency int,
PRIMARY KEY (nodeip, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC)
其中,nodeip - 主键和时间戳 - 聚类键(通过descinding oder排序以获取最新的),
此表格中的示例数据
SELECT * from nodedata WHERE nodeip = '172.30.56.60' LIMIT 2;
nodeip | timestamp | flashmode | physicalusage | readbw | readiops | totalcapacity | writebw | writeiops | writelatency
--------------+---------------------------------+-----------+---------------+--------+----------+---------------+---------+-----------+--------------
172.30.56.60 | 2017-12-08 06:13:07.161000+0000 | yes | 34 | 57 | 19 | 27 | 8 | 89 | 57
172.30.56.60 | 2017-12-08 06:12:07.161000+0000 | yes | 70 | 6 | 43 | 88 | 79 | 83 | 89
这是正确可用的,每当我需要获取统计数据时,我都可以使用下面的分区键获取数据,
SELECT nodeip,readbw,timestamp FROM nodedata WHERE nodeip = '172.30.56.60' AND timestamp < 1512652272989 AND timestamp > 1512537899000;
还成功汇总了以下数据,
SELECT sum(readbw) FROM nodedata WHERE nodeip = '172.30.56.60' AND timestamp < 1512652272989 AND timestamp > 1512537899000;
现在是下一个用例,我需要获取群集数据(四个节点的所有数据),
如下所示,
SELECT nodeip,readbw,timestamp FROM nodedata WHERE nodeip IN ('172.30.56.60','172.30.56.61','172.30.56.62','172.30.56.63') AND timestamp < 1512652272989 AND timestamp > 1512537899000;
但它在网站数量上明确提到,“IN查询”有很多性能问题,那么你在上面提到的'nodedata'数据模型中的建议是什么? (注意:在不同的分区中执行多个查询是可以的,我觉得这是最后一个选项)
您是否有更好的方法(或)以更好的方式重新设计此数据模型(或)从多个分区检索数据的任何更好的解决方案?
任何帮助都会非常明显。
谢谢,
哈利
答案 0 :(得分:1)
是的,不鼓励在分区键上使用IN
,因为它会给协调节点带来更多负载,特别是如果在IN
子句中指定了很多分区。例如,多个单独的异步请求甚至可以提高性能,并减少协调节点的负担。
此外,您需要考虑分区的大小 - 从快速查看到架构,我发现如果您每分钟都在进行抽样,那么每个分区将在一年内增长到〜55Mb。分区太宽可能也会导致一些性能问题(尽管并非总是如此,取决于用例)。也许您需要更改分区键以包括年份或年份+月份来制作更小的分区。但在这种情况下,当您检索跨越数年/月的数据时,应该在代码中添加一些额外的逻辑。
P.S。也许这不是一个完全回答你的问题,但评论领域太小了: - )