gpt4 book ai didi

cassandra - 在 ScyllaDB 中获取 N 行的最佳方法

转载 作者:行者123 更新时间:2023-12-01 22:53:57 25 4
gpt4 key购买 nike

我有一个用例,我使用 ScyllaDB 来限制用户在过去 24 小时内的操作。假设用户在过去 24 小时内只能下订单 3 次。我正在使用 ScyllaDB 的 ttl 并计算表中的记录数以实现此目的。我还使用 https://github.com/spaolacci/murmur3 获取分区键的哈希值。

但是,我想知道查询表的最有效方法是什么。所以我有一些疑问,我想更好地理解并比较行为(如果我的陈述有误,请纠正我):

  1. 使用count()

count() 将执行全扫描查询,这意味着它可能会向表中查询超过必要的记录。

SELECT COUNT(1) FROM orders WHERE hash_id=? AND user_id=?;

  1. 使用限制

limit 只会限制返回给客户端的记录数。这意味着它仍将查询与其谓词匹配的所有记录,但仅限制返回的记录。

SELECT user_id FROM orders WHERE hash_id=? AND user_id=? LIMIT ?;

  1. 使用分页

我对此有点陌生,但如果我正确阅读了文档,它应该只查询 up 直到它收到前 N 条记录,而不必查询整个表。因此,如果我将页面大小限制为我想要获取的记录数并且只查询第一页,它会正常工作吗?它会产生一致的结果吗?

文档:https://java-driver.docs.scylladb.com/stable/manual/core/paging/index.html

我的查询仍在使用限制,但利用驱动程序通过 https://github.com/gocql/gocql 实现此目的

iter := conn.Query("SELECT user_id FROM orders WHERE hash_id=? AND user_id=? LIMIT ?",hashID,userID,3).PageSize(3).PageState(nil).Iter()

请让我知道我的分析是否正确以及最好选择哪种方法

最佳答案

您的客户端应始终使用分页 - 否则您可能会给查询协调器增加压力,这可能会引入延迟和内存碎片。如果您使用 Scylla Monitoring 堆栈(如果您不使用,则应该这样做!),请参阅 CQL 优化仪表板,更具体地说,请参阅 Paged Queries面板。

现在,回答你的问题。似乎您的示例对于您实际想要实现的目标来说有点简约,而且 - 即使那样 - 如果不是这样,我们必须大规模考虑这种设置。例如:可能有一个租户允许在一天内下3个订单,但另一个租户允许在一周内下100万个订单?

如果上述假设是正确的 - 并且使用您手头提供的选项 - 您最好使用 LIMIT 进行分页。原因是因为您手头的描述存在一些特殊问题:

  • 首先,您想在特定时间范围内检索 N 条记录,但您的查询没有指定这样的时间范围
  • 其次,COUNTLIMIT都会发起分区扫描,不清楚hash_id + user_id 组合可以确定 时间范围内的记录数。

当然,这可能是我错了,但我想建议一些不同的方法,这些方法可能适用于或不适用于您和您的用例。

  • 考虑集群键的时间戳组成部分。这将允许您避免使用以下查询进行完整分区扫描:

SELECT something FROM orders WHERE hash_id=? AND user_id=? AND ts >= ? AND ts < ?;

  • 如果以上不适用,那么可能是 Counter Table能满足你的需要吗?您可以在下订单后简单地增加一个计数器,然后 - 之后 - 查询计数器表,如下所示:

SELECT count FROM counter_table WHERE hash_id=? AND user_id=? AND date=?;

希望对您有所帮助!

关于cassandra - 在 ScyllaDB 中获取 N 行的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73684114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com