首页 文章

在Cassandra中选择All Performance

提问于
浏览
2

我目前正在使用DB2并计划使用cassandra,因为我知道cassandra的读取性能高于RDBMS .

可能这是一个愚蠢的问题,但我有实验比较DB2和Cassandra之间的读取性能 .

使用500万条记录和相同的表架构进行测试 . 使用查询 SELECT * FROM customer . DB2使用25-30s,Cassandra使用40-50s .

但查询条件 SELECT * FROM customer WHERE cusId IN (100,200,300,400,500) DB2使用 2-3s 和Cassandra使用 3-5ms .

为什么Cassandra比具有条件的DB2更快?所以我不能用 SELECT * FROM customer 来证明哪个数据库更大?

仅供参考 .

Cassandra:RF = 3且CL = 1,每个节点在3台计算机上运行3个节点(VM-Ubuntu)

DB2:在Windows上运行

表模式:

cusId int PRIMARY KEY, cusName varchar

2 回答

  • 2

    如果你看看Cassandra擅长解决的问题类型,那么为什么未绑定("Select All")查询的原因变得非常明显 .

    Cassandra旨在成为分布式数据库 . 在许多Cassandra存储模式中,节点数大于复制因子(I.E.,并非所有节点都包含所有数据) . 因此,限制网络跃点的数量对于建模高性能查询至关重要 . Cassandra在特定查询(利用分区/集群密钥结构)方面表现非常出色,因为它可以快速定位主要负责数据的节点 .

    未绑定查询(A.K.A.多键查询)会产生额外的网络时间,因为需要协调器节点 . 因此,一个节点充当协调器,查询所有其他节点,整理数据并返回结果集 . 指定WHERE子句(至少具有分区键)并使用“令牌感知”负载 balancer 策略时,执行效果有两个原因:

    • 不需要协调器节点 .

    • 查询主要负责范围的节点,将结果集返回到单个netowrk跃点中 .

    tl;dr;

    使用未绑定的查询查询Cassandra,如果使用WHERE子句指定查询,则会导致它通常不必执行大量额外处理和网络时间 .

  • 2

    即使像无条件范围查询这样麻烦的查询,40-50s对于C *来说也是非常极端的 . 协调员是否通过协调打击了GC?你能包含用于测试的代码吗?

    当你制作一个 select * 对数百万条记录时,它不会同时获取所有记录,它会一次获取fetchSize . 如果你只是迭代这个,即使你最初使用了executeAsync,迭代器也会实际阻塞 . 这意味着每10k(默认)记录它将发出一个您将阻止的新查询 . 从网络角度来看,这需要时间序列化 . http://docs.datastax.com/en/developer/java-driver/3.1/manual/async/#async-paging解释了如何以非阻塞方式执行此操作 . 您可以使用它来处理下一页提取,同时处理有用的电流 .

    减小限制或获取大小也可能有所帮助,因为协调器可以一次一个地走一个令牌范围(这里可能存在并行性,但它的启发式不完美),直到它已经足够读取 . 如果它必须走太多节点来响应它将会很慢,这就是为什么空表可以非常慢地执行 select * ,它可以串行遍历每个副本集 . 使用256个vnode可能非常糟糕 .

相关问题