MyRocks_zh_doc

数据导入

默认情况下,MyRocks配置针对短事务进行了优化,而不是针对数据加载进行了优化。 MyRocks有几个特殊的会话变量可以加速数据加载。

分批批量加载

如果您的数据保证以主键顺序加载,则建议使用此方法。此方法的工作原理是首先删除任何辅助索引, 以主键顺序将数据加载到表中,然后通过快速辅助索引创建来恢复辅助密钥。

创建辅助(二级)索引

将数据加载到空表时,强烈建议先删除所有二级索引,然后加载数据,并在完成加载数据后添加所有二级索引。 MyRocks有一个名为”快速二级索引创建”的功能。执行CREATE INDEX或ALTER TABLE… ADD INDEX时会自动使用快速二级索引创建。 使用快速二级索引创建时,二级索引条目将直接写入最底层的RocksDB级别并绕过压缩。 这明显降低了在较高级别上的解压缩和压缩数据的总写入量和CPU时间。

数据加载

如上所述,强烈建议仅对具有主键(无二级索引)的表进行加载数据,并在加载数据后添加所有二级索引。

将数据加载到RocksDB表时,有两个建议的session变量

SET session sql_log_bin=0;
SET session rocksdb_bulk_load=1;

从大型MyISAM/InnoDB表转换时,您可以创建MyRocks表,如下所示:

SET session sql_log_bin=0;
SET session rocksdb_bulk_load=1;
ALTER TABLE large_myisam_table ENGINE=RocksDB;
SET session rocksdb_bulk_load=0;

使用sql_log_bin = 0可以避免写入二进制日志。

使用rocksdb_bulk_load = 1,MyRocks进入特殊模式,将所有插入写入最底层的RocksDB级别, 并跳过将数据写入MemTable和以下压缩,这是加载数据的非常有效的方法。

rocksdb_bulk_load模式在几个条件下运行:

1、批量加载的数据不会与表中的现有数据重叠。确保这一点的最简单的方法是始终批量加载到空表中,
   但模式将允许将一些数据加载到表中,执行其他操作,然后如果正在加载的内容之间没有重叠则返回并批量加载附加数据以及已经存在的东西。
2、在批量加载模式结束之前数据可能不可见(即:rocksdb_bulk_load再次设置为0),使用的方法是构建SST文件,然后将其原样添加到数据库中。
   在添加特定的SST之前,系统的其余部分将无法看到数据,因此在当前正在批量加载的表上发出SELECT将仅显示较旧的数据,并且可能不会显示最近添加的行。
   结束批量加载模式将导致添加最新的SST文件。批量加载多个表时,启动新表将触发代码将最新的SST文件添加到系统中 -- 因此,在批量加载模式下,
   不建议将INSERT语句交错到两个表或多个表。

默认情况下,rocksdb_bulk_load模式希望所有的数据都按主键排序(或反向排序)插入。如果数据是反向排序(即数据在正常排序的主键上降序或在反向排序的主键升序) 则行以块的形式缓存,以切换顺序以匹配预期的顺序。不按顺序插入一行或多行将导致错误,并可能导致某些数据被插入表中而有些则不会。 要解决此问题,可以修复插入的数据顺序,截断表,然后重新启动。

未分类的批量加载

如果您的数据未按主键顺序排序,则建议使用此方法。使用此方法,不需要删除和恢复辅助索引。但是,写入主键不再直接转到SST文件, 而是写入临时文件进行排序,因此这种方法需要额外的成本。

要允许加载未排序的数据:

SET session sql_log_bin=0;
SET session rocksdb_bulk_load_allow_unsorted=1;
SET session rocksdb_bulk_load=1;
...
SET session rocksdb_bulk_load=0;
SET session rocksdb_bulk_load_allow_unsorted=0;

请注意,只使用rocksdb_bulk_load禁用(设置为0)来更改rocksdb_bulk_load_allow_unsorted 在这种情况下,所有输入数据都将经过一个中间步骤,将行写入临时SST文件,按主键顺序对它们进行排序, 然后以正确的顺序写入最终的SST文件。

其他方法

(1)如果rocksdb_bulk_load不符合您的需求,则还有其他两个可能有用的设置:unique_check和rocksdb_commit_in_the_middle.
   默认情况下,启用unique_check并禁用rocksdb_commit_in_the_middle.
(2)如果禁用unique_check,MyRocks将跳过唯一约束检查。换句话说,您必须自己确保源数据不会被破坏唯一性约束。如果违反了唯一约束,则较旧的行将被具有相同键的较新行静默覆盖。
   此选项不允许REPLACE和INSERT ON DUPLICATE KEY UPDATE语句(返回错误)
(3)如果启用了rocksdb_commit_in_the_middle,则MyRocks会在事务中间隐式提交每个rocksdb_bulk_load_size记录(默认值为1000)
   如果数据加载在语句中间失败(LOAD DATA或批量INSERT),则行不会完全回滚。但某些行存储在表中。要重新启动数据加载,您需要截断表并再次加载数据。
(4)如果您在未启动rocksdb_bulk_load或rocksdb_commit_in_the_middle的情况下加载大数据,请确保事务大小足够小。正在进行的事务所有修改都保存在内存中。