【问题标题】:SQLite faster than MySQL?SQLite 比 MySQL 快?
【发布时间】:2015-06-09 17:16:09
【问题描述】:

我想设置一个 teampeak 3 服务器。我可以选择 SQLite 和 MySQL 作为数据库。好吧,我通常倾向于“不要在生产中使用 SQLite”。但另一方面,它是一个团队语音服务器。好吧,让我用谷歌搜索一下……我找到了这个:

  1. 速度
    SQLite3 比 MySQL 数据库快得多。这是因为文件数据库总是比 unix socket 快。当我请求编辑频道时,在 MySQL 数据库 (127.0.0.1) 上大约需要 0.5-1 秒,在 SQLite 3 上几乎是立即 (0.1 秒)。[...]

http://forum.teamspeak.com/showthread.php/77126-SQLite-vs-MySQL-Answer-is-here

我不想引发 SQLite 与 MySQL 的争论。我只想问:他的论点是否有效?我无法想象他所说的是真的。但不幸的是,我不够专业,无法自己回答这个问题。

也许 TeamSpeak 开发人员的数据库架构在 SQLite 和 MySQL 之间存在一些重大差异,这解释了速度上的巨大差异(我无法想象这一点)。

【问题讨论】:

  • 我可以相当肯定地说,SQLite 在 DROPPING 表上速度较慢。我相信原因是 MySQL 将每个表存储在离散文件中,而 SQLite 将整个 DB 存储在一个文件中……需要搜索和销毁,而不仅仅是删除文件。删除我的表需要 1.5 分钟,删除 SQLite DB 需要 1 秒。
  • 请记住整个“不要在生产中使用sqlite”仅指需要许多并发读/写的应用程序,sqlite绝对是一个生产质量的RDBMS。任何说其他话的人都是骗子。根据预期并发请求的数量,使用 sqlite 可能比其他 RDBMS 好得多。我多年来一直将 sqlite 用于只需要简单登录等的小型 Web 应用程序。而且我已经并且仍然在大型(许多用户发布许多更新)应用程序上使用 mysql,很明显 sqlite 比 mysql 快多少。

标签: mysql database sqlite teamspeak


【解决方案1】:

我没有亲自测试过 SQLite 与 MySQL,但很容易在网上找到相反的例子 (for instance)。您确实提出了一个不太虔诚的问题:这个论点有效吗?

首先,论点的本质有些似是而非。 Unix 套接字将用于与数据库服务器通信。 “文件数据库”似乎是指通过编译接口进行通信的事实。在 SQLite 的术语中,它是server-less。大多数数据库将数据存储在文件中,因此术语“文件数据库”有点误导。

数据库的性能涉及多个因素,例如:

  • 查询到数据库的通信。
  • 编译速度(存储预编译查询的能力是一个优势)。
  • 处理速度。
  • 能够处理复杂的处理。
  • 编译器优化和执行引擎算法。
  • 将结果返回给应用程序。

编译接口会影响其中的第一个和最后一个。没有什么可以阻止无服务器数据库在其他方面表现出色。然而,数据库服务器通常有数百万行代码——比 SQLite 大得多。其中很多都支持额外的功能。其中一些支持改进的优化和更好的算法。

与大多数性能问题一样,答案是根据您环境中的数据自行测试系统。无服务器并不是自动的性能提升。拥有服务器并不能使数据库“更好”。它们是针对不同优化点设计的不同应用程序。

【讨论】:

  • SQLite's own site 说,“SQLite 不与客户端/服务器数据库竞争。SQLite 与 fopen() 竞争。”
【解决方案2】:

相关的区别在于 SQLite 使用更简单的锁定算法(简单的全局数据库锁定)。

使用细粒度锁定(如 MySQL 和大多数其他数据库服务器所做的那样)要复杂得多,如果只有一个数据库用户,则速度会更慢,但如果您希望允许更多并发,则需要.

【讨论】:

    【解决方案3】:

    SQLite 中的首次访问时间会更快

    SQLite 的访问时间一开始会显得更快,但这是在少数用户在线的情况下。 SQLite 使用非常简单的访问算法,速度快但不处理并发。

    随着数据库开始增长,同时访问的数量将开始受到影响。服务器处理多个请求的方式完全不同,而且更加复杂,并且针对高并发进行了优化。例如,如果正在进行更新,SQLite 将锁定整个表,并将订单排队。

    RDBMS 做了很多额外的工作,使它们更具可扩展性

    例如 MySQL,即使只有一个用户也会创建一个访问 QUEUE,部分锁定表而不是只允许单个用户每次执行,以及其他非常复杂的任务,以确保任何其他人仍然可以访问数据库同时访问。

    这将使单个用户的连接速度变慢,但在未来有 100 个用户在线时会有所回报,在这种情况下,简单的 “锁定整个表并每次执行一个查询” SQLite 的过程会占用服务器。

    SQLite 是为简单和独立的数据库应用程序而设计的。

    如果您希望一次有 10 个同时访问写入数据库,那么 SQLite 可能会表现良好,但您不希望有 100 个用户的应用程序使用 SQLite 不断地向数据库写入和读取数据。它不是为这种情况而设计的,它会浪费资源。

    考虑到您的 TeamSpeak 场景,您可能可以使用 SQLite,即使对于某些业务也可以,某些网站需要只读数据库,除非添加新内容。

    对于这种用途,SQLite 是一种廉价、易于实施、独立、完美的解决方案,可以完成工作。

    【讨论】:

    • 你能提供一些这方面的资料吗?
    • 在链接中检查“何时不使用 SQLite”:digitalocean.com/community/tutorials/…
    • SQLite 支持 WAL,如果启用它,将不会出现 db 级别的独占锁。如果你认为 WAL (binlog) 仍然有一次写入的限制,那么其他产品如 MySQL 也有这个限制。
    【解决方案4】:

    简而言之:

    • 对于本地应用程序数据库、单用户应用程序和保留小数据的小型简单项目,SQLite 是赢家。
    • 对于网络数据库应用程序、多用户和并发、负载平衡和不断增长的数据管理、安全性和基于滚动的身份验证、大型项目和广泛使用的服务,您应该选择 MySql。

    在您的问题中,我不太了解 teampeak 服务器以及它实际需要保存在其数据库中的数据类型,但如果它只需要一个本地 DBMS 而不需要处理大量并发和管理 SQLite 将是我的选择.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      相关资源
      最近更新 更多