Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该使用SQLite而不是MySQL吗?_Mysql_Performance_Sqlite - Fatal编程技术网

我应该使用SQLite而不是MySQL吗?

我应该使用SQLite而不是MySQL吗?,mysql,performance,sqlite,Mysql,Performance,Sqlite,我需要改进一个PHP MySQL web应用程序,它只使用MySQL进行REPL操作(和一些搜索函数)。我使用的99%的应用程序从未使用过高级MySQL功能,如复制、跨表约束、锁定等 据我所知,我应该改用SQLite 如果我这样做有什么实际好处吗? 我会看到明显的(>100ms)速度提升吗? 如果表的行数超过1000000行,是否会出现问题?对此没有全面的答案,但需要考虑的一个要点是:一个非常好的经验法则是,并发度越高,从MySQL中获得的利润就越多,反之亦然 这意味着,在数据库请求永远不会并发

我需要改进一个PHP MySQL web应用程序,它只使用MySQL进行REPL操作(和一些搜索函数)。我使用的99%的应用程序从未使用过高级MySQL功能,如复制、跨表约束、锁定等

据我所知,我应该改用SQLite

如果我这样做有什么实际好处吗? 我会看到明显的(>100ms)速度提升吗?
如果表的行数超过1000000行,是否会出现问题?

对此没有全面的答案,但需要考虑的一个要点是:一个非常好的经验法则是,并发度越高,从MySQL中获得的利润就越多,反之亦然

这意味着,在数据库请求永远不会并发的情况下,您可能会看到使用SQlite的加速效果,尽管我怀疑它会达到100ms量级

这背后的原因(非常粗略):

在数据库服务器环境(如MySQL、PostgreSQL、MS SQL、Oracle和friends)中,一个专用进程(或一组进程)专门处理数据库文件-重要的部分是专用的。这意味着,并发问题可以在进程中解决

在基于文件的数据库中,如SQlite、MS Access(Jet Engine)和friends,多个进程将在彼此不知道的情况下接触DB文件-这意味着必须通过将它们写入DB或helper文件来解决并发问题。这通常要慢得多,也不太健壮。作为交换,数据库客户端(web应用程序)和数据库服务器(正在处理中)之间的通信开销是不存在的

编辑


在评论之后,我想说得更清楚,我说的是并发写入,而不是并发读取。对不变数据集的并发读取不是一个困难的问题-它根本不需要任何锁定。

SQLite的主要优点是它是一个基于文件的关系数据库,使用SQL作为其查询语言。基于文件极大地简化了部署,这对于应用程序需要少量数据库但必须在数据库服务器存在问题的环境中运行的情况非常适合。(例如,许多浏览器使用SQLite来管理它们的cookie存储;使用数据库服务器来解决这个问题在很多方面都近乎疯狂。)


MySQL(具有sane表类型)的主要优点是它是一个使用SQL作为查询语言的数据库服务器。基于服务器允许使用许多基于文件的系统无法简单处理的功能(如复制),但确实会使部署变得更加复杂


数据库服务器(如MySQL)额外复杂性的好处是否大于成本(相对于基于文件的数据库引擎,如SQLite),取决于许多因素,值得注意的是,包括预期的安装数量以及预计由谁来执行这些安装。

使用MySQL时,您会遇到任何问题吗?@PeeHaa否。但我很好奇,从2008年开始,是否会有任何好处-性能-简单性-这类东西,但是:它们是针对不同场景设计的两个不同数据库。。不是建设性的。快速的谷歌搜索应该可以消除关于何时一个或另一个或两者最适合某个特定任务/方法的疑虑。这里的并发主要是“并发/混合写入”。SQLite基本上有免费的“并发读取”;文件锁定/争用发生在必须获得锁时,这与WAL和传统操作模式略有不同。此外,SQLite完全符合ACID,并且与客户机-服务器数据库一样“健壮”(除非在其他地方讨论的非常特定的情况/非本地文件系统中,在一些非常特定的边缘情况下缺乏保证的fsync)。但是,这种ACID的“成本”是需要获得系统级文件锁,这是限制写入并发性的原因。@pst更新了我的答案,以更清楚地反映我所说的是写入,而不是读取。关于健壮性,我的意见是,故障恢复能力和性能之间的权衡仍然有利于数据库服务器,而不是基于文件的数据库。在需要手动干预的不干净关闭之后,每个遇到SQlite臭名昭著的“数据库锁定”的人都可能持有相同的观点,我还没有开始讨论基于文件的家族中的其他成员。这当然不应被理解为SQLite的一个批评家:我认为SQLite是这个家族的一个非常好的成员,我使用它非常正规。SQLite是酸兼容的并且非常健壮。少数的边缘案例是有文档记录的-除非硬件或关键文件系统出现故障(这对MySQL等来说同样糟糕),否则没有问题。我希望现在已经足够清楚地说明了这一点!请理解,英语不是我的第一语言。