【发布时间】:2012-10-09 16:02:57
【问题描述】:
我想比较 PostgreSQL 和 Cassandra 在单个节点上的读取性能。
我有一个 8 列、150000 行的表。要将其转换为列族,我将主键设置为 Cassandra 中的行键,其余列与 PostgreSQL 中的一样。此外,我将数据批量加载到 Cassandra SSTables 中,因此两者的数据都在磁盘上。
从 PostgreSQL 读取表:
select * from tableName;
花费200ms左右。
为了读取列族(启用 keycache 和 rowcache),我尝试了 thrift API(get_range_slices 方法)和 CQL2.0。前者平均需要大约 7000 毫秒,而后者则需要 100000 毫秒。
我知道如果从 Cassandra Memtables 读取它可能会非常快。但是既然它们都是从磁盘读取的,为什么 Cassandra 会慢很多呢?
哪些底层机制至关重要?
编辑:
客户列族
CREATE COLUMN FAMILY customer
WITH comparator = UTF8Type
AND key_validation_class = UTF8Type
AND caching = all
AND column_metadata =
[
{column_name: C_NAME, validation_class: UTF8Type},
{column_name: C_ADDRESS, validation_class: UTF8Type},
{column_name: C_NATIONKEY, validation_class: UTF8Type},
{column_name: C_PHONE, validation_class: UTF8Type},
{column_name: C_ACCTBAL, validation_class: UTF8Type},
{column_name: C_MKTSEGMENT, validation_class: UTF8Type},
{column_name: C_COMMENT, validation_class: UTF8Type}
];
这是我的节俭查询
// customer is that column family of 150000 rows
ColumnParent cf1 = new ColumnParent("customer");
// all columns
SlicePredicate predicate = new SlicePredicate();
predicate.setSlice_range(new SliceRange(ByteBuffer.wrap(new byte[0]), ByteBuffer.wrap(new byte[0]), false, 100));
// all keys
KeyRange keyRange = new KeyRange(150000);
keyRange.setStart_key(new byte[0]);
keyRange.setEnd_key(new byte[0]);
List<KeySlice> cf1_rows = client.get_range_slices(cf1, predicate, keyRange, ConsistencyLevel.ONE);
还有我的 CQL2.0 查询:
select * from customer limit 150000;
编辑:
我责怪自己的标题具有误导性,所提供的数据可能会带来更多争议。我不是在这里挑选赢家。
他们都在做磁盘 I/O(这不是 Cassandra 的典型用例),而且他们的时间不同,所以一定是有原因的。我很好奇他们处理这个问题的方式。 因此,如果你们对底层机制有所了解,我将不胜感激。
这不是苹果对苹果的比较,但我担心的是味道。一个更酸可能是因为它含有更多的维生素 C。这对我来说很重要。
谢谢。
【问题讨论】:
-
你能发布你的节俭查询吗?有时查询可能会以非常低效的方式编写。
-
@baba 我已经发布了查询
-
Cassandra 通常对可变长度键执行键范围查询非常慢。您还可以发布您的列族定义吗?您使用 BytesType 比较器吗?另外,您是否尝试过使用 keyRange.setEnd_key(Bytes.fromLong(Long.MAX_VALUE).getBytes());代替你的结束键的新字节[0]?
-
@baba setEnd_key 这样会返回错误的结果
-
这是为什么呢?我假设你的键是长的,所以如果你使用的是 BytesType 比较器,那么你的 keyRange 可以从 0 开始到最大值。
标签: postgresql io cassandra