# DELETE
DELETE FROM [db.]table WHERE expr
DELETE FROM
从表 [db.]table
中删除与表达式 expr
匹配的行。被删除的行会立即标记为已删除,并会自动在所有后续查询中过滤掉。数据的清理会在后台异步进行。
例如,以下查询会删除 hits
表中所有 Title
列包含文本 hello
的行:
DELETE FROM hits WHERE Title LIKE '%hello%';
在 MyScale(和 ClickHouse)中,这个操作被称为轻量级删除。与 ALTER TABLE ... DELETE
(opens new window) 语句相比,它的开销要小得多。默认情况下,轻量级删除是异步的。然而,我们已经将 mutations_sync
(opens new window) 配置为 1,这意味着客户端将等待一个副本处理该语句。
请注意,由于效率问题,我们已经禁用了对具有向量索引的表的 ALTER TABLE ... DELETE
查询。我们建议在所有表上使用 DELETE FROM
,因为它速度更快。
# 如何更新数据
在 ClickHouse 中,用户可以使用 ALTER TABLE ... UPDATE
(opens new window) 命令来更新数据。然而,在 MyScale 中,不建议使用此命令来进行向量更新。更好的方法是使用删除和插入。
例如,以下查询演示了如何更新 test_vector
表中 id
列等于 100 的行。
DELETE FROM test_vector WHERE id = 100;
INSERT INTO test_vector values (100, [-0.045589335, ..., 0.026581138]);
请注意,MyScale 是一款 OLAP 数据库,并未针对频繁的插入和删除操作进行优化。为了获得最佳性能,最好在单个语句中执行多个数据插入和删除,而不是单独处理每一行数据。以下示例演示了如何在单个语句中高效地执行批量插入和删除操作:
DELETE FROM test_vector where id in (2, 3, 5, 7, 11, ...);
INSERT INTO test_vector values (2, [-0.045589335, ..., 0.026581138]), (3, [-0.051993933, ..., 0.031703997]), (5, [-0.038116932, ..., -0.116080105]), ...;
使用 ALTER TABLE ... UPDATE
是不推荐的。
ALTER TABLE test_vector UPDATE vector = [-0.045589335, ..., 0.026581138] WHERE id = 100;