1

我知道在同一 Cassandra 行上发出大量删除是一种反模式,因为读取需要时间(请阅读此处)。但我也看到进行删除需要更多时间。

考虑这个 python 脚本,它将多个值添加到同一行,然后再次添加它们,然后一次删除它们,然后再次添加它们。对于每个活动,时间都会被监控并显示在屏幕上。

import cql
from time import time

connection = cql.connect('localhost',cql_version='3.0.0', keyspace='rkg')
cursor = connection.cursor()

try:
    cursor.execute("DROP TABLE test")
except:
    pass

cqlStatement = """
    CREATE TABLE test (
        a int,
        b text,
        c text,
        d text,
        PRIMARY KEY (a,b,c)
    );
"""
cursor.execute(cqlStatement)

n = 1000

insertStatement = """
    INSERT INTO test (a,b,c,d)
    VALUES ({0},'{1}','{2}','{3}');
"""

deleteStatement = """
    DELETE FROM test
    WHERE a = {0} AND b = '{1}' AND c = '{2}';
"""

t = time()
for i in xrange(0,n):
    cursor.execute(insertStatement.format(1,i,i,i))
print "initial insert time:\t"+ str(time() - t)

t = time()
for i in xrange(0,n):
    cursor.execute(insertStatement.format(1,i,i,i))
print "second insert time:\t"+ str(time() - t)

t = time()
for i in xrange(0,n):
    cursor.execute(deleteStatement.format(1,i,i))
print "delete time:\t"+ str(time() - t)

t = time()
for i in xrange(0,n):
    cursor.execute(insertStatement.format(1,i,i,i))
print "next insert time:\t"+ str(time() - t)

此脚本的输出如下所示:

$ python insertDeleteTest.py 
    initial insert time:    0.369267940521
    second insert time:     0.368498086929
    delete time:           10.8632941246
    next insert time:       0.313306808472

有人能告诉我为什么与插入相比,列删除需要这么长时间吗?

我的心智模型是插入或删除基本上是同一件事:一个无实体的列,它被写入提交日志的末尾并被塞入内存表中。在插入的情况下,它包含该列的新值,在删除的情况下,它包含该列的墓碑。我的心智模型哪里出了问题?

4

0 回答 0