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

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

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

启用WAL之后,数据库大部分写操作变成了串行写(对WAL文件的串行操作),对写入性能提升有非常大的帮助;同时读写操作可以互相完全不阻塞(如#2.3所述)。上述两点比较好的解释了启用WAL带来的提升;同时推荐一个写连接 + 多个读连接的模型,如下图所示:

sqlite事务模型、性能优化tips、常见误区

3.2.1 读写连接分离的细节

  • 读操作使用不同的连接并发执行,可以完全避免由于显式事务、写操作之间的锁竞争带来的死锁
  • 所有的写操作、显式事务操作都使用同一个连接,且所有的写操作、显式事务操作都串行执行

可以完全避免由于显式事务、写操作之间的锁竞争带来的死锁,如#2.2.1提到的死锁的例子

并发写并不能有效的提高写入效率,参考如下伪代码,哪段执行更快?

  1. // two transactions:  
  2. void Transaction_1() { 
  3.         connection_->Exec("BEGIN"); 
  4.       connection_->Exec("insert into table(value) values('xxxx')"); 
  5.       connection_->Exec("COMMIT"); 
  6.  
  7. void Transaction_2() { 
  8.         connection_->Exec("BEGIN"); 
  9.       connection_->Exec("insert into table(value) values('xxxx')"); 
  10.       connection_->Exec("COMMIT"); 
  11.  
  12. // code fragment 1: concurrent transaction 
  13. thread1.RunBlock([]() -> void { 
  14.       for (int i=0; i< 100000; i++) { 
  15.             Transaction_1(); 
  16.     } 
  17. }); 
  18.  
  19. thread2.RunBlock([]() -> void { 
  20.       for (int i=0; i< 100000; i++) { 
  21.             Transaction_2(); 
  22.     } 
  23. }); 
  24.  
  25. thread1.Join(); thread2.join(); 
  26.  
  27. // code fragment 2: serial transaction 
  28. for (int i=0; i< 100000; i++) { 
  29.   Transaction_1(); 
  30. for (int i=0; i< 100000; i++) { 
  31.   Transaction_2(); 

3.3 针对具体业务场景,设置合适的WAL SIZE

如#2.3提到,过大的WAL文件,会让查找操作从B-Tree查找退化成线性查找(WAL中page连续存储);但大的WAL文件对写操作较友好。对于大记录的写入操作,较大的wal size会有效提高写入效率,同时不会影响查询效率

3.4 针对业务场景分库分表

分库分表可以有效提高数据操作的并发度;但同时过多的表会影响数据库文件的加载速度。现在数据库方向的很多研究包括Auto sharding, paxos consensus, 存储和计算的分离等;Auto

application-awared optimization,Auto hardware-awared optimization,machine

learning based optimization也是不错的方向。

3.5 其他

包括WAL checkpoint策略、WAL size优化、page size优化等,均需要根据具体的业务场景设置。

4,常见问题 & 误区

4.1 线程安全设置及误区

sqlites configuration options: https://sqlite.org/c3ref/c_config_getmalloc.html

按照sqlite文档,sqlite线程安全模式有以下三种:

SQLITE_CONFIG_SINGLETHREAD(单线程模式)

This option sets the threading mode to Single-thread. In other words, it disables all mutexing and puts SQLite into a mode where it can only be used by a single thread.

SQLITE_CONFIG_MULTITHREAD(多线程模式)

(编辑:西安站长网)

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

热点阅读