MySQL · myrocks · fast data load

Fast data load

Load data相比普通insert效率更高,Load data批量插入数据有效减少了解析SQL的开销。MyRocks 同其他MySQL 引擎一样也支持Load data语法,同时MyRocks对data load也做了特殊优化。RocksDB引擎有一个规律是,数据最终会存储在最底层SST文件中,MyRocks通过参数rocksdb_bulk_load控制是否直接将数据存储在最底层SST文件中,而不走普通的insert流程。

先来看下普通insert流程(图片来自yoshinorim)

优化后的bulk load流程(图片来自yoshinorim)

由于SST文件中的数据必须是有序的,所以 bulk load特性有一个限制是插入的数据必须是按主键有序的。

Insert和Load data都支持bulk load特性,Load data文件中的数据容易保证有序,但对于非自增insert来说,要保证有序插入比较困难,因此bulk load特性对普通insert意义不大。

rocksdb_bulk_load设为1后,开启bulk load特性。值得注意的是,在 bulk load特性下,会默认忽略唯一性检查,同时rocksdb_commit_in_the_middle自动开启。

Bulk load 源码实现

  • step 1 第一次插入时会新建SST临时文件, 参见myrocks::Rdb_sst_info::open_new_sst_file
    文件形如:test.t1_PRIMARY_0_0.bulk_load.tmp
    db.tablename_indexname_count1_count2_.bulk_load.tmp
    其中count1每次都会原子自增,防止并发load时出现重名的情况。
    其中count2表示当前是第几个SST临时文件
  • step 2 随后插入都会直接插入到SST临时文件中,参见myrocks::Rdb_sst_info::put
  • step 3 SST临时文件写满或load结束,将SST临时文件copy或hard link为正式的SST文件,同时更新SST元数据信息,参考rocksdb::ExternalSstFileIngestionJob::Prepare/ExternalSstFileIngestionJob::Run
  • step 4 删除临时SST文件,参考ExternalSstFileIngestionJob::Cleanup

如果bulk load中途mysqld crash有可能残留SST临时文件,mysqld重启时会自动清理SST临时文件。参考Rdb_sst_info::init

Bulk load 相关测试

load data 测试

Bulk load下rocksdb load data比innodb快近3倍。
Bulk load下rocksdb load data比rocksdb 普通load data快近6倍。

perf top

可以看出bulk load模式下,插入流程要简洁很多。

  • rocksdb without bulk load
  • rocksdb with bulk load

insert 测试

由于SQL解析占比重较大,bulk load模式下的insert优势并不明细。

perf top

可以看出普通insert相比load data有更多的SQL解析操作(MySQLparse),同时非bulk load下的insert比bulk load下insert有更多的排序操作(KeyComparator)。

  • insert without bulk load
  • insert with bulk load
时间: 2024-10-14 19:59:03

MySQL · myrocks · fast data load的相关文章

myrocks fast load data

Fast data load Load data相比普通insert效率更高,Load data批量插入数据有效减少了解析SQL的开销.MyRocks 同其他MySQL 引擎一样也支持Load data语法,同时MyRocks对data load也做了特殊优化.RocksDB引擎有一个规律是,数据最终会存储在最底层SST文件中,MyRocks通过参数rocksdb_bulk_load控制是否直接将数据存储在最底层SST文件中,而不走普通的insert流程. 先来看下普通insert流程(图片来自

PDS WH 项目轶事之Master Data Load

PDS WH 项目轶事之Master Data Load   刚上项目,就听说PDS WH项目是一个很centralized的项目,客户总部的IT Team管控很严格,强势推全球模板,并且有一个专门的data team负责导入项目上所有的主数据.   这个曾经让我很开心,因为这个符合我个人定义的真正的global项目的标准,认为这个项目一定很好做.毕竟实现业务流程的方案都采用全球模板,不用做太多的本地化开发与定制,加上我们Local顾问团队不用负责导入各种主数据,工作量明显会很少.   客户gl

mysql中导入数据load data在myisam与innodb区别

innodb数据表结构如下:  代码如下 复制代码 Create Table: CREATE TABLE `tinnodb` ( `id` int(11) DEFAULT NULL, `content` mediumtext ) ENGINE=InnoDB DEFAULT CHARSET=utf8 表中的数据为4194304行,通过select into outfile导出  代码如下 复制代码 root@localhost:tiger>select * from tinnodb into ou

MySQL · myrocks · data dictionary 分析

data dictionary rocksdb作为mysql的一个新的存储引擎,在存储引擎层,会维护自已的元数据信息.在innodb存储引擎中,我们通过information_schema下的INNODB_SYS_DATAFILES,INNODB_SYS_TABLES,INNODB_SYS_INDEXES等表, 可以窥视innodb的元数据信息.同样,rocksdb通过information_schema下的ROCKSDB_INDEX_FILE_MAP,ROCKSDB_DDL,ROCKSDB_G

MySQL · myrocks · myrocks之备份恢复

myrocks支持逻辑备份和物理备份,逻辑备份仍然采用mysqldump,物理备份采用自己开发的myrocks_hotbackup工具,传统的物理备份工具Xtrabackup不支持rocksdb.由于rocksdb的存储特性,myrocks不管是逻辑备份还是物理备份,与innodb的备份恢复均有较大差别. 逻辑备份 myrocks的mysqldump工具支持rocksdb的逻辑备份,其使用方式与原生的mysqldump备份innodb没有区别,一般的使用方式如下 mysqldump -uroot

MySQL · myrocks · 相关tools介绍

概述 MyRocks提供了丰富的tools,如sst_dump, mysql_ldb等,这些工具对我们的运维和分析问题非常有用. sst_dump 可以导出sst中的数据和属性信息. sst_dump --help sst_dump --file=<data_dir_OR_sst_file> [--command=check|scan|raw] --file=<data_dir_OR_sst_file> Path to SST file or directory containin

解决MYSQL的unable to load dynamic library错误

1. 问题的描述 今天php的mysql突然不好用了.先后提示下面的错误信息: 没有找到 libmysql.dll 因此这个应用程序未能启动 apache php startup: Unable to load dynamic library : C:/ApacheGroup/php5/ext\php_mysql.dll 进而,在调用mysql函数的时候会出错: Fatal error: Call to undefined function: mysql_connect() 产看了下我的系统,p

关于MySQL数据迁移--data目录直接替换注意事项的详解

近日更换服务器,要做数据库迁移,将数据库内的数据从服务器A迁移到服务器B.由于数据量较大,直接做dump耗时太长,故而采用如下方式处理:首先,在服务器B上安装了与服务器A同版本的MySQL,停止MySQL服务,将安装后的data目录删除: 然后,服务器A锁住全部表,从服务器A将整个data目录和数据文件直到拷贝到服务器B上,修改服务器B上MySQL的my.cnf文件中的datadir指向新的data目录. 最后,启动服务器B上的MySQL服务. 结果启动失败,报出 "无法启动MySQL服务&qu

MySQL · myrocks · myrocks index condition pushdown

index condition pushdown Index condition pushdown(ICP)是直到mysql5.6才引入的特性,主要是为了减少通过二级索引查找主键索引的次数.目前ICP相关的文章也比较多,本文主要从源码角度介绍ICP的实现.讨论之前,我们先再温习下. 以下图片来自mariadb 引入ICP之前 引入ICP之后 再来看个例子 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` char(8) DEFAULT NULL,