数据库插入操作的语句如下:
insert into table values (a1, b1)
涉及到SQL层和存储层,其中SQL层需要解析SQL语句,生成抽象语法树(AST),计算表达式等,存储层需要判断主键冲突,包括增量数据和基线数据上的主键冲突,如果是非重复主键,则将数据插入到增量数据中。
上条插入语句只插入一行数据,称之为单条插入,相应地,还可以在一条语句中插入多行数据,称之为批量插入。
insert into table values (a1, b1), (a2, b2), (a3, b3)
批量插入的多行数据作为一个事务,所有数据插入成功,或者所有数据插入失败,不会出现部分数据插入成功的情况。批量插入相对于单条插入在性能上有很大优势,SQL解析只需要做一次,事务只需要做一次,因此理应在相同的时间内插入更多行数据。
此前,OceanBase的单条插入与批量插入使用的是同一套接口,从SQL层读取一行,检查冲突,插入数据,然后反复重复这个过程,直到没有数据为止。这样的代码看起来非常优雅,却没有利用到批量插入的特点而做针对性的优化。
批量插入引擎每次可以读取一批数据,比如500行,然后做批量检查冲突,再批量插入到增量数据中(内存B+树),目前做的只有批量读和检查冲突,批量插入留到以后再做。看似很简单的优化,性能却提升了很多,在递增插入场景,Sysbench bulk insert的单线程测试中,无基线数据时,性能提升30%,有基线数据时,性能提升了100%。性能提升的原因有如下几点:
·END·
相关阅读:MySQL与MongoDB,该如何做技术选型?
应该如何正确理解BFF架构设计?
私藏多年的系统性能优化十大绝招(万字干货)
面对复杂业务系统,通用架构设计法则
高可用高性能核心原理探究,Kafka 核心全面总结
服务接口优化的常见方案实战总结聊聊分布式服务下的八种异步实现方式
有没有那么一瞬间,你也曾有过“失业焦虑”?浅析分布式系统中的补偿机制设计问题聊聊分布式日志系统的设计与实践
执行个 DEL 竟然也会阻塞 Redis?深挖一下果然不简单
PHP 中数组是如何灵活支持多数据类型的?
一文带你看通透,MySQL事务ACID四大特性实现原理
通过alter table 来实现重建表,同事大呼开眼界了实习生疑问:为什么要在需要排序的字段上加索引呢?代码多版改造,应用责任链设计模式
参考文章:https://www.modb.pro/db/508155 版权申明:内容来源网络,仅供学习研究,版权归原创者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!