我希望比较单节点上 PostgreSQL 和 Cassandra 的读取性能。
我有一张包含8列,150000行的表。为了将其转换为Cassandra中的列族,我将主键作为行键,并将其余列保留在PostgreSQL中。此外,我将数据批量加载到Cassandra SSTables中,因此两者的数据都存储在磁盘上。
从PostgreSQL中读取表格:
select * from tableName;
大约需要200毫秒。
为了读取带有键缓存和行缓存的列族,我尝试了thrift API(get_range_slices方法)和CQL 2.0。前者平均需要约7000毫秒,而后者则不堪忍受地需要100000毫秒。
我知道如果从Cassandra内存表中读取,速度可能非常快。但是由于它们都从磁盘中读取,为什么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}
];
这是我的Thrift查询。
// 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。这对我很重要。
谢谢。