加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Sqlite事务模型、性能优化Tips、常见误区

发布时间:2019-09-27 06:34:16 所属栏目:建站 来源:hamsongliu
导读:副标题#e# 0.前言 本文主要介绍sqlite的事务模型,以及基于事务模型的一些性能优化tips,包括事务封装、WAL+读写分离、分库分表、page size优化等。并基于手淘sqlite的使用现状总结了部分常见问题及误区,主要集中在多线程的设置、多线程下性能优化的误区等

2.4.1 结论

  • 多线程设置是决定DDL、DML、WAL(包括SHM)操作是否线程安全的设置
  • 多线程设置与读写(连接)分离没有任何关系,并不是实现读写(连接)分离的必要条件(很多人对这一点有误解)

3,性能优化tips

3.1 合理使用事务

由#2.2的分析可知,写操作会在RESERVED状态下将数据更改、b-tree的更改、日志等写入page cache,并最终flush到数据库文件中;使用事务的话,只需要一次对DB文件的flush操作,同时也不会对其他连接的读写操作阻塞;对比以下两种数据写入方式(这里以统一存储提供的API为例),实测耗时有十几倍的差距(当然对于频繁的读操作,使用事务可以减事务状态的切换,也会有一点点性能提升):

  1. // batch insert in transaction with 1000000 records 
  2. // 
  3. AliDBExecResult* execResult = NULL; 
  4. _database->InTransaction([&]() -> bool {    // in transaction 
  5.   auto statement = _database->PrepareStatement("INSERT INTO table VALUES(?, ?)"); 
  6.   for (auto record : records) {    // bind 1000000 records 
  7.     // bind record 
  8.     ... 
  9.     ... 
  10.     statement->AddBatch(); 
  11.   } 
  12.   auto result = statement->ExecuteUpdate(); 
  13.   return result->is_success_; 
  14. }); 
  15.  
  16.  
  17. // batch insert with 1000000 records, no transaction 
  18. // 
  19. auto statement = _database->PrepareStatement("INSERT INTO table VALUES(?, ?)"); 
  20. for (auto record : records) {    // bind 1000000 records 
  21.   // bind record 
  22.   ... 
  23.   ... 
  24.   statement->ExecuteUpdate(); 

3.2 启用WAL + 读写(连接)分离

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读