如何从Cassandra 3.6中删除数据?附sg.products表定义
嘿,针对你用的Cassandra 3.6版本和这个sg.products表,我来给你详细讲讲删除数据的方法,还有一些实操中要注意的点:
基础删除操作
你的表主键是(date_updated, time_added, id),其中date_updated是分区键,time_added和id是聚类列。Cassandra的DELETE操作必须指定分区键(不然没法定位到具体数据所在的分区,还会触发性能极差的全表扫描),下面是几种常见的删除场景:
1. 删除单条特定记录
要精准删除某一条数据,需要指定完整的主键组合:
DELETE FROM sg.products WHERE date_updated = '2024-05-20' AND time_added = 1716182400 AND id = 'prod123';
2. 删除整个分区的所有数据
如果想删掉某个date_updated对应的所有产品记录,只需要指定分区键即可:
DELETE FROM sg.products WHERE date_updated = '2024-05-20';
也可以缩小范围,删除分区内符合聚类列条件的记录(比如删除某天中早于某个时间添加的产品):
DELETE FROM sg.products WHERE date_updated = '2024-05-20' AND time_added < 1716182400;
(注:因为你的表聚类顺序是time_added ASC,所以可以对time_added用范围查询,要是聚类列没指定顺序,这类范围操作会受限)
3. 删除单条记录的特定字段
如果不想删掉整条记录,只想清除某个字段的值(比如best_seller标记),可以直接指定字段名:
DELETE best_seller FROM sg.products WHERE date_updated = '2024-05-20' AND time_added = 1716182400 AND id = 'prod123';
批量删除多条记录
要是需要一次性删掉多条不同的记录,可以用BATCH语句打包操作:
BEGIN BATCH DELETE FROM sg.products WHERE date_updated = '2024-05-20' AND time_added = 1716182400 AND id = 'prod123'; DELETE FROM sg.products WHERE date_updated = '2024-05-21' AND time_added = 1716268800 AND id = 'prod456'; APPLY BATCH;
⚠️ 注意:Cassandra的BATCH不是为了高性能批量处理设计的,别一次性塞几十上百条操作进去,不然会拖慢集群。
实操关键注意事项
- 墓碑(Tombstones):Cassandra不会立刻物理删除数据,而是写入一个“墓碑”标记数据已删除,后续的压缩操作才会真正清理掉这些数据。如果一次性删大量数据,会产生很多墓碑,拖慢查询性能,记得定期监控墓碑数量,必要时调整压缩策略。
- 自动过期(TTL):如果希望数据自动过期删除,插入时可以加
TTL,也能给已存在的数据更新TTL:
上面这条语句会让目标记录在24小时后自动被标记为删除。UPDATE sg.products USING TTL 86400 SET company = company WHERE date_updated = '2024-05-20' AND time_added = 1716182400 AND id = 'prod123'; - 一致性级别:删除操作默认的一致性级别是
ONE(只要有一个副本确认删除就返回成功),如果需要确保所有副本都同步删除,可以指定QUORUM:DELETE FROM sg.products WHERE date_updated = '2024-05-20' USING CONSISTENCY QUORUM; - 禁止全表扫描删除:千万别尝试不带分区键的DELETE(比如
DELETE FROM sg.products WHERE id='prod123'),这会触发全表扫描,严重影响集群性能,Cassandra 3.6也会默认阻止这类操作,别去改配置绕过它。
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

