我想在单个节点上比较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。这对我来说很重要。
谢谢。