Sqlite3插入性能测试

Posted

技术标签:

【中文标题】Sqlite3插入性能测试【英文标题】:Sqlite3 insert performance test 【发布时间】:2012-03-19 22:43:27 【问题描述】:

在高并发 SQLite 块表环境中丢失数据。我正在寻找在不丢失插入查询数据的情况下提高 SQLite 高并发性能的方法。我的意图是知道以“高并发”站点工作(在本例中为请求插入 1 个)的方式插入的并发用户的限制。为了使这个测试用例更简单,用户将发送数据保存在数据库中

查看其他用户如何提高性能和使用建议后:

sqlite.org sqlite.org/faq.html#q19 ***.com/questions/1711631/how-do-i-improve-the-performance-of-sqlite ***.com/questions/54998/how-scalable-is-sqlite

我决定在亚马逊小实例中做一个小测试。

平台

Linux 版本 2.6.35.14-106.53.amzn1.i686 (mockbuild@build-31003.build) (gcc 版本 4.4.5 20110214 (Red Hat 4.4.5-6) (GCC)) #1 SMP Fri Jan 6 16 :20:23 UTC 2012 Sqlite 3.6.20 Lighttpd 1.4.29 php 5.3.10

带有插入sql的test.php:

PRAGMA 同步 = 关闭;开始交易;插入test (data1,date) 值 ('".$_POST['data1']."',date() ); 结束交易;

使用 Apache HTTP 服务器基准测试工具。

数据库是文件系统中的文件,而不是内存中的文件。

结论: 测试 1:ab -n 10000 -c 50 -k xxxx.xxx/test.php?data1=fc82bf71a0d5f8a3c2dc868ebe0d6eaa

测试时间:63.637 秒 完成请求:10000 失败的请求:0 Sqlite 插入行数:10050 平均:159.52 次插入/sg

测试2:ab -n 10000 -c 100 -k xxxx.xxx/test.php?data1=fc82bf71a0d5f8a3c2dc868ebe0d6eaa

测试时间:64.221 秒 完成请求:10000 失败的请求:0 Sqlite 插入行数:10100 平均:157.26 次插入/sg

测试3:ab -n 10000 -c 150 -k xxxx.xxx/test.php?data1=fc82bf71a0d5f8a3c2dc868ebe0d6eaa

测试时间:33.338 秒 完成请求:10000 请求失败:7095 (连接:0,接收:0,长度:7095,异常:0) SQLITE:已插入 2905 行 平均:丢失数据!!

TEST4:ab -n 10000 -c 200 -k xxxx.xxx/test.php?data1=fc82bf71a0d5f8a3c2dc868ebe0d6eaa

测试时间:33.705 秒 完成请求:10000 请求失败:7049 (连接:0,接收:0,长度:7049,例外:0) SQLITE:插入了 2918 行 平均:丢失数据!!

在这个特定的环境中,我们可以使用 SQLite 最多 100 个并发用户,平均 157.26 insert/sg。您考虑到此结果仅适用于插入数据。

从我的无知来看,可以防止丢失数据吗?有可能提高这种性能吗?

【问题讨论】:

我喜欢 SQLite,但你真的没有发挥它的优势......为什么不登录到一个文件,然后定期将其导入 SQLite 我们在生产环境中使用 sqlite3,大约有 20 个用户用于基于 Web 的 Rails 应用程序(并非所有人都同时在线)。到目前为止,我们还没有听到投诉。现在我们正在开发一个有大约 60 个用户的 Web 应用程序,我们想知道是否需要使用其他数据库,例如 postgres 或 mysql。您的帖子有助于了解 sqlite3 的限制,并且 100 个并发用户对我们的应用程序看起来不错。您是否尝试从多台电脑启动插入或插入更大的数据集? Sqlite3 使用非常简单,我们喜欢它。 c=100 和 150 之间是否有 c 测试而不会丢失数据? 你甚至没有包含你的php测试代码,我们可以改进它 【参考方案1】:

我认为在你的情况下不应该使用 Sqlite3。是的,sqlite3 是嵌入式数据库之一,它可以很好地处理并发性,但为了更好地扩展和提高性能,我建议简单地使用服务器/客户端数据库。

让我们看看您在大约 30 秒内发出 10000 个请求的最后一个测试。如果它们被平均分配,Sqlite3 将不允许每个事务需要超过 3 毫秒(请记住,sqlite3 一次只允许一个写入进程)。让我们看一下 sqlite 文档。 (http://www.sqlite.org/faq.html)

我们知道没有其他嵌入式 SQL 数据库引擎支持 与 SQLite 一样多的并发性。 SQLite 允许多个进程拥有 数据库文件一次打开,供多个进程读取 数据库一次。当任何进程要写入时,它必须锁定 更新期间的整个数据库文件。但这通常 只需几毫秒。

总结:只是数据库的锁定需要几毫秒,而不是更新本身。

但是,客户端/服务器数据库引擎(例如 PostgreSQL、MySQL 或 Oracle)通常支持更高级别的并发性并允许 多个进程同时写入同一个数据库 时间。这在客户端/服务器数据库中是可能的,因为有 始终有一个受控良好的服务器进程可用于协调 使用权。如果您的应用程序需要大量并发,那么 您应该考虑使用客户端/服务器数据库。但是经验 表明大多数应用程序需要的并发性比它们的 设计师想象。

你有几种可能:

更改应用程序的工作方式。您不太可能需要这么多并发。 如果您仍然坚持需要并发性和良好而可靠的性能,请切换到客户端/服务器数据库。 当您的负载达到峰值时,接受某些请求失败。

【讨论】:

以上是关于Sqlite3插入性能测试的主要内容,如果未能解决你的问题,请参考以下文章

sqlite3 性能测试 - 如何快速重置/清除缓存

golang SQLite3性能测试

Sqlite3插入大量数据性能优化

sqlite3 多线程和锁 ,优化插入速度及性能优化

转-Mongodb亿级数据量的性能测试

Mongodb亿级数据量的性能测试