我在这方面做了很多搜索,但一直没有太多的运气。作为测试,我编写了一个C# WinForms应用程序,在其中我启动了可配置数量的线程,并让每个线程将可配置数量的数据写入到该线程创建的SQLite数据库中的许多表中。所以每个线程创建它自己的SQLite数据库,并且只有那个线程与之交互。
我所看到的是,由于并发,肯定会发生一些性能下降。例如,如果我大致同时启动每个线程,则写入SQLite表的性能会比在每个线程中设置一个随机的启动延迟来分散它们的访问权限的性能直线下降。
SQLite的启动速度对于我的测试来说已经足够快了,我可以在三分之一秒内将20,000行插入到一个表中,但是一旦我启动了250个线程,同样的20,000行可能需要几分钟才能写入每个数据库。
我尝试了很多方法,包括定期提交、设置Sychronous=Off、使用参数化查询等。这些都有助于缩短每个语句所需的时间(从而减少并发活动的变化),但没有什么能真正解决这个问题,我希望有人能给我一些建议。
谢谢!安迪
发布于 2014-10-13 21:32:43
在任何关系数据库中,过多的并发写入都会导致一些速度减慢。根据你正在尝试优化的场景,你可以做很多其他的事情,我能想到的很少:
1)创建批处理而不是并发写入,这意味着如果您期望大量用户同时写入,收集他们的数据并以更大的组刷新它们,请注意这意味着,当我们的队列正在收集应用程序宕机时,您将丢失数据,您可以对日志等非关键数据执行此操作。
2)如果你的线程在插入数据之前还需要做其他工作,你仍然可以让我们的线程,然后添加一个信号量或其他等价于插入发生的代码部分的东西,这将限制并发性并加快整个过程。
3)如果你想做的是通过你想做的工具进行批量插入,那么在你的问题中提到,很多mysql dba会比我更好地回答我们的问题。
https://stackoverflow.com/questions/26330604
复制相似问题