sqlite3和mysql之间有速度差异吗?
Posted
技术标签:
【中文标题】sqlite3和mysql之间有速度差异吗?【英文标题】:Is there a speed difference between sqlite3 and mysql? 【发布时间】:2010-09-20 20:05:39 【问题描述】:经过大量谷歌搜索后,我一直想知道 mysql 和 sqlite3 之间有什么好处/区别。我主要希望在将我的开发数据库移动到我的生产数据库时减速,尽管我认为这主要发生在我的代码中。有谁知道性能上的主要区别是什么?在那里?或者你能指出一些比较这两者的文献的方向吗?
【问题讨论】:
【参考方案1】:我希望从您的问题来看,您不是在谈论在开发和生产中使用不同的数据库系统。
如果您在开发和生产中使用不同的数据库,请不要。不同的数据库引擎表现不同,会导致出现意想不到的错误。尽量让您的开发系统接近生产环境(提示:在 VM 中运行)
SQLite 和 MySQL 都是合适的产品。了解他们的能力是什么。
SQLite:
与客户端应用程序在进程内运行 没有网络功能 因此查询开销非常低 对于简单的查询来说可能相当快,因为要做的 IPC、系统调用和数据复制更少。 并发性非常有限(我认为每个数据库文件只有一个写入器或多个读取器)MySQL:
更多功能 引擎的选择(InnoDB 为许多工作负载提供了良好的功能) 对存储、备份、恢复等进行更多控制 支持网络 - 允许在大规模应用中使用 更好的并发性 - InnoDB 引擎具有 MVCC,这意味着读取器不会阻塞写入器,写入器也不会阻塞读取器。即使是旧的 MyISAM 引擎也有表级锁定,而不是整个数据库的 sqlite。 可能是复杂查询的更好优化器简而言之,您无法真正比较它们。 SQLite 作为一种嵌入式数据库非常流行——Firefox 3 里面就有一个。
在 SQLite 中,您被困在将数据库存储在本地磁盘(当然,如果有的话,也可以是网络磁盘)上。如果您想扩展您的 Web 应用程序,您可能必须使用基于服务器的数据库,例如 MySQL。
【讨论】:
在 Rails 中,在开发和生产中拥有不同的数据库并不是什么大问题,因为 ActiveRecord 抽象了数据库访问。也就是说,您仍然会在使用非平凡的 AR 时遇到麻烦。 尽管有包装器,但不同的数据库确实有不同的怪癖。 SQLite 几乎可以让你侥幸逃脱,但 Postgres 不会。 我希望我能给这条评论投票 100 次。虽然 ActiveRecord 抽象了 SQL 后端的大部分差异,但让您的开发和生产环境尽可能相似只是常识。我已经被 SQLite 和 MySQL 之间的差异所困扰了很多次。不要这样做! 我希望我可以将此评论投反对票 100 次。 sqlite 用于轻型用途,非常适合开发。另一方面,MySQL 是用于开发的 PITA。我总是使用 sqlite 进行开发,使用 MySQL 进行生产。唯一的例外是当我使用 MySQL 特定的功能时。 完全同意这个答案。我不知道您为什么要尝试通过在开发和生产中使用不同的数据库来增加额外的混乱层,从而使调试应用程序变得困难。然后,您所测试的只是您为开发环境设置的代码是否有效,而不是整个系统。【参考方案2】:SQLite 是一个嵌入式数据库引擎,但它与您的应用程序在同一进程中运行。 MySQL,是一个在自己的进程中运行的数据库服务器。
SQLite 不会浪费应用程序服务器进程和数据库服务器进程之间的处理和带宽打包请求。它只是解析请求,确定要做什么(查询计划),然后在 SQLite 数据库文件上调用 fopen() 并执行查询。
当您的站点受到大量并发请求的影响时,MySQL 会更好,并且您需要额外的线程和队列来正确处理所有请求。
如果您的网站每天的点击量不超过 100000 次,或者您的数据库大小不超过 25 GB,那么 SQLite 可能是最好的数据库。 SQLite 的另一个优点是,您通常可以在额外进程或数据库服务器稀缺的情况下轻松使用它。查看http://www.sqlite.org/whentouse.html。
您还可以使用 SQLite 做其他事情。查看http://www.squidoo.com/sqlitehammer 了解有关 SQLite 的其他见解。
【讨论】:
+1 因为这个答案是少数真正了解 SQLite 知识的答案之一。【参考方案3】:这里有一个简单的方法来看待它:Sqlite 是记事本,MySQL 是 MS Word。两者基本上做同样的事情,但它们的核心非常非常不同,用于不同的目的。
Sqlite 是一个很好的数据库,而且通常足够好,而 MySQL 是一个复杂得多的系统,但随着复杂性而来的是强大的功能。
我还必须建议不要在开发和生产中使用不同的数据库。使用与客户使用的不同的东西是愚蠢的。如果您在开发过程中需要加速,您的客户可以在他们使用您的程序时使用相同的加速。
【讨论】:
【参考方案4】:SQLite 是最快的
SQLite 只能通过一个连接访问,使用文件系统存储所有内容,不使用任何服务器。
它又快又轻。实际上应该是 MySQL 的两倍。
SQLite 和 MySQL 不用于相同的任务
您将 SQLite 用于不需要存储超过 5 Go 数据的简单应用程序。例如:本地议程、音乐播放器、模拟甚至是您将嵌入 USB 密钥的网站演示。
Mysql,否则,需要为更大的项目选择,因为它可以处理大量数据并且可以同时访问。您可以将它用于具有用户访问权限的网站、Intranet 等。
【讨论】:
不是:sqlite.org/speed.html。引用:“对于大多数常见操作,SQLite 2.7.6 通常比 MySQL 3.23.41 快(有时快两倍以上)。”如果有人有链接,我找不到 sqlite3 和 Mysql5 的统计信息? 我同意 e-satis。使用 SQLite,您只需运行查询和文件 I/O。使用 MySQL,您必须在查询和文件 I/O 中添加数据编组、套接字写入、套接字读取、数据解析。【参考方案5】:这在不同的语言中可能会有所不同,但在 php 中,如果您只是偶尔修改数据库,SQLite 就很好。这是因为为了确保完整性,每当要修改数据库时,都会锁定 SQLite 文件,进行更改并将其写入文件,然后解锁文件。在此期间,任何其他进程都无法访问数据库,并且在此期间来自其他进程的请求是否失败或阻塞取决于实现。
【讨论】:
【参考方案6】:实际上我发现自己需要重新投影我的程序的数据库逻辑(已经在生产中),因为 SQlite 的一个错误是当面临相对大量的数据和操作时,它根本无法锁定数据库并离开如此,直到程序关闭,这意味着每个程序数据的进度都是暂时的,然后每个添加都将丢失。可爱吗?
迁移到 MySql,我明白了,我尝试了一些方法来测试速度差异,并得出了一个安全查询,如“UPDATE table SET column1=column1”在 280'500 条记录的表上,SQlite大约需要 13 秒,而 MySql 只需要 1 秒。
我仍然不是数据库专家,但选择是一个简单的考虑:如果您需要一个简单的内存存储来存储有限的数据量、复杂性和并发性(例如小型实用程序或运行非关键程序的程序) data) 那么 SQlite 就可以了,否则当你需要稳定性、并发性、大量数据、查询复杂时,你的 db 将是 MySql。
关于开发和生产中的不同数据库我不同意,但如果你这样做了,你肯定有充分的理由。
【讨论】:
您没有在 SQLite 中使用事务。请RTFM。在一个事务中,您的“UPDATE Table SET”将花费不到一秒钟的时间。关于稳定性,SQLite 是一个真正的原子数据库,并且是我所知道的经过最佳测试的 SQL 引擎之一。关于大量数据,我见过几 GB 的 SQLite 数据库(MySQL 使用的数据是 SQLite 的两倍),可以立即运行。 我确实使用了事务,但我不再关心它的速度了。关键是浪费了多年的“数据库被锁定”错误(现在可以解决)。在link 找到了一些关于它的东西。它当然是稳定的,但我曾经被它烫伤过,现在只是我的次要任务;)以上是关于sqlite3和mysql之间有速度差异吗?的主要内容,如果未能解决你的问题,请参考以下文章
C ++:这两种将数字写入矩阵的方式之间在速度上有显着差异吗?
MySql数据库数据类型和Sql Server 数据库数据类型之间的差异