我知道在同一个Cassandra行上发出大量删除是一种反模式,因为它需要花费时间来进行读取(read here)。但我也发现删除时间要多一些时间。
考虑这个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
有人告诉我为什么列删除与插入相比花了这么长时间?
我的心理模型是插入或删除基本上是相同的东西:一个无实体的列,它被写入提交日志的末尾并被塞进记忆中。在插入的情况下,它包含该列的新值,在删除的情况下,它包含该列的逻辑删除。我的心理模型出了什么问题?