我知道在同一 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
有人能告诉我为什么与插入相比,列删除需要这么长时间吗?
我的心智模型是插入或删除基本上是同一件事:一个无实体的列,它被写入提交日志的末尾并被塞入内存表中。在插入的情况下,它包含该列的新值,在删除的情况下,它包含该列的墓碑。我的心智模型哪里出了问题?