热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

提高SQLite的每秒UPDATE性能?

如何解决《提高SQLite的每秒UPDATE性能?》经验,如何解决这个问题?

我的问题直接来自这个问题,虽然我只对UPDATE感兴趣并且只对此感兴趣.

我有编写的应用程序中C/C++,这使得大量使用的SQLite,主要是SELECT/UPDATE,在一个非常频繁间隔(约20个查询每0.5至1秒)

我的数据库不大,此刻约有2500条记录,这里是表结构:

CREATE TABLE player (
   id INTEGER PRIMARY KEY AUTOINCREMENT,
   name VARCHAR(64) UNIQUE,
   stats VARBINARY,
   rules VARBINARY
);

到目前为止,我没有使用,transactions因为我正在改进代码并希望稳定而不是性能.

然后我通过仅执行10 update查询来测量我的数据库性能,以下(在不同值的循环中):

// 10 times execution of this
UPDATE player SET stats = ? WHERE (name = ?)

其中stats一个JSON恰好是150个字符,name是5-10个字符.

没有交易,结果是不可接受的: - 大约1整秒(每个0.096)

随着交易,时间下降x7.5倍: - 约0.11 - 0.16秒(每个0.013)

我尝试删除数据库的大部分和/或重新排序/删除列,以查看是否有任何改变,但事实并非如此.即使数据库只包含100条记录(已测试),我也会得到上述数字.

然后我试着玩PRAGMA选项:

PRAGMA synchrOnous= NORMAL
PRAGMA journal_mode = MEMORY

给了我较小的时间但不总是,更像是0.08 - 0.14秒

PRAGMA synchrOnous= OFF
PRAGMA journal_mode = MEMORY

最后给了我非常小的时间大约0.002 - 0.003秒,但我不想使用它,因为我的应用程序每秒保存数据库,并且很有可能在操作系统/电源故障时数据库损坏.

C SQLite的查询代码是:(省略了注释/错误处理/无关的部分)

// start transaction
sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, NULL);

// query
sqlite3_stmt *statement = NULL;
int out = sqlite3_prepare_v2(query.c_str(), -1, &statement, NULL);
// bindings
for(size_t x = 0, sz = bindings.size(); x 

如你所见,这是一个非常典型的TABLE,记录数量很小,而且我做了一个简单的简单UPDATE10次​​.我还能做些什么来减少我的UPDATE时间吗?我正在使用最新的SQLite 3.16.2.

注意:上面的时间直接来自单个END TRANSACTION查询.查询是在一个简单的事务中完成的,我正在使用一个准备好的语句.

更新:

我在执行启用和禁用事务以及各种更新计数时执行了一些测试.我使用以下设置执行测试:

VACUUM;
PRAGMA synchrOnous= NORMAL;  -- def: FULL
PRAGMA journal_mode = WAL;    -- def: DELETE
PRAGMA page_size = 4096;      -- def: 1024

结果如下:

没有交易(10次更新)

0.30800秒(每次更新0.0308)

0.30200秒

0.36200秒

0.28600秒

没有交易(100次更新)

2.64400秒(每次更新0.02644)

2.61200秒

2.76400秒

2.68700秒

没有交易(1000次更新)

28.02800秒(每次更新0.028)

27.73700秒

..

交易(10次更新)

0.12800秒(每次更新0.0128)

0.08100秒

0.16400秒

0.10400秒

交易(100次更新)

0.088秒(每次更新0.00088)

0.091秒

0.052秒

0.101秒

交易(1000次更新)

0.08900秒(每次更新0.000089)

0.15000秒

0.11000秒

0.09100秒

我的结论是,transactions没有任何意义time cost per query.也许随着更新次数的增加,时代变得越来越大,但我对这些数字并不感兴趣.单个交易的10到1000次更新之间几乎没有时间成本差异.但是,我想知道这是否是我的机器上的硬件限制,并不能做太多.~100使用单个事务并且即使使用WAL也可以使用10-1000次更新,我似乎不能低于毫秒.

没有交易,固定的时间成本大约是0.025几秒钟.


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
author-avatar
广东暖暖_小乖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有