MyRocks_zh_doc

更快的delete删除操作

MyRocks提供会话变量,通过牺牲一些事务语义来更快的删除:

* 跳过持有锁(rocksdb-master-skip-tx-api)
* 按主键盲目删除(rocksdb-blind-delete-primary-key)
* 范围删除的隐式提交(rocksdb-commit-in-the-middle)

跳过持有锁 Skipping holding row lock

启用rocksdb-master-skip-tx-api会话变量后,MyRocks不会使用RocksDB的Transaction API,而是使用RocksDB的WriteBatch API
由于WriteBatch API比Transaction API快得多,因此您每秒可以更新或删除更多行。然而,这带来了一个重要的限制。
启用rocksdb-master-skip-tx-api后,会话不再保留任何行锁。
因此,用户有责任确保行更新/删除不会发生冲突。不正确使用此功能可能会导致数据损坏/不一致。

按主键盲目删除 Blind Deletes by primary key

启用rocksdb-blind-delete-primary-key会话变量h后,MyRocks会在执行删除操作之前跳过验证行是否存在的方法。
这将加快删除速度。这称为"盲删"。如果满足一下所有条件,则启用盲删除。

1、rocksdb-blind-delete-primary-key 会话变量为ON
2、目标表只有主键,没有辅助索引
3、按主键删除
4、Delete语句中只给出了单个表

例如,在DELETE上没有启用盲删除...DELETE .. WHERE id < 10。如果未启用盲删除,则MyRocks只执行传统的删除(如果行存在,则查找行并发出删除)

如果要删除许多已知的主键,则可以通过组合rocksdb-blind-delete-primary-key和rocksdb-master-skip-tx-api会话变量来获得非常高的删除吞吐量。
强烈建议使用批量删除语法来消除查询解析开销(即DELETE FROM t WHERE id IN(1,2,3,4,5,6,......,10000))。

使用Blind Deletes时,您需要注意不要多次对相同的主键执行Deletes。 
MyRocks不再检查密钥是否存在,只是发出给定主键的删除。如果多次对同一个密钥执行Delete,
它将在RocksDB中生成许多逻辑删除,这可能会降低读取性能。在从属服务器上,您需要配置“读取自由复制”,
以便对同一个密钥的多次删除不会停止复制。

范围删除的隐式提交 Implicit commits on range deletes

如果要删除大量行并且主键未知,那么rocksdb-commit-in-the-middle会话变量很有用。启用此会话变量后,MyRocks会每1000次(可配置为rocksdb_bulk_load_size)行隐式提交事务。
通常,在单个事务中修改太多行会导致性能和内存消耗问题。通过隐式提交事务,单个查询的批量修改操作可以更容易。

如果语句失败,则可以部分提交行。因此,如果无法安全地重复运行语句,则不应启用此变量。

也不建议在事务中间使用commit,因为它会隐式提交您的事务,从而无法进行回滚。
此外,中间的提交使用单独的迭代器来扫描密钥,因此当前事务的本地任何修改都不会在同一事务中可见。