SQLite的可扩展性如何?
我最近读了这个有关SQLite vs MySQL的问题,答案指出,SQLite不能很好地扩展和官方网站sorting – 确认这一点 ,但是。
SQLite的可扩展性如何,它的最高限制是什么?
昨天我发布了一个小网站*来跟踪你的代表,为所有访问者使用共享的SQLite数据库。 不幸的是,即使把它放在我的主机上的适度负载,它运行得非常缓慢。 这是因为每次有人查看页面时,整个数据库都被locking,因为它包含更新/插入。 我很快就转向了MySQL,虽然我没有太多的时间来testing它,但它似乎比SQLite更具可扩展性。 我只记得缓慢的页面加载,偶尔会得到一个数据库locking的错误,当试图执行查询在shell中的sqlite。 这就是说,我从SQLite运行另一个网站就好了。 不同的是,该网站是静态的(即我是唯一可以更改数据库),所以它适用于并发读取。 道德故事:只使用SQLite的网站更新数据库很less发生(比每页加载less)。
编辑 :我刚刚意识到,我可能不公平的SQLite – 我没有索引SQLite数据库中的任何列,当我从网页提供。 这部分导致了我正在经历的放缓。 然而,观察数据库locking的立场 – 如果你有特别繁重的更新,SQLite的性能将不匹配MySQL或Postgres。
另一个编辑:自从我在3个月前发布这个版本以来,我有机会仔细研究SQLite的可伸缩性,并且有一些技巧可以扩展。 正如我在第一次编辑中提到的那样,数据库索引大大减less了查询时间,但这更像是关于数据库的一般观察,而不是SQLite。 不过,还有一个技巧可以用来加速SQLite: 交易 。 每当你必须做多个数据库写入,把它们放在一个事务中。 每次发出写入查询时,不要写入(和locking)文件,只有在事务完成时写入才会发生。
我提到的我在第一段中发布的网站已经被切换回SQLite,并且一旦我在几个地方调整了我的代码,它运行得非常顺利。
*该网站不再可用
Sqlite是可扩展的单用户方面,我有多千兆字节的数据库,performance非常好,我没有太多的问题。
但它是单用户的,所以它取决于你在谈论什么样的缩放。
回应评论。 请注意,没有什么能够阻止在多用户环境中使用Sqlite数据库,但是每个事务(实际上,每个修改数据库的SQL语句)都会locking该文件 ,从而阻止其他用户访问数据库全部 。
所以如果你对数据库做了很多的修改,你基本上会很快地遇到扩展问题。 另一方面,如果与写访问相比,您拥有大量的读访问权限,则可能并不是那么糟糕。
但是Sqlite当然会在多用户环境下运行,但是性能不会很好。
SQLite驱动sqlite.org网站和其他有很多stream量的网站。 他们build议,如果你每天点击less于10万次,SQLite应该可以正常工作。 这是写在他们提交“先行录入”function之前。
如果你想用SQLite加快速度,请执行以下操作:
- 升级到SQLite 3.7.x
- 启用预写日志logging
- 运行以下编译指示:“PRAGMA cache_size =页数;” 默认大小(页数)是2000页,但是如果你提高这个数字,那么你会提高直接运行的数据量。
您可能需要查看一下YouTube上的video,名为“ 使用先进日志logging改进SQLite性能 ”,其中显示了如何使用预写式日志logging,并显示写入速度提高了5倍。
你读过这个SQLite文档 – http://www.sqlite.org/whentouse.html ?
对于中低stream量网站(也就是所有网站的99.9%)来说,SQLite通常会起到很好的作用。 SQLite可以处理的networkingstream量的大小,当然取决于网站使用数据库的程度。 一般来说,任何每天点击次数less于100K的站点应该可以正常使用SQLite。 10万点击/天的数字是一个保守的估计,不是一个硬性上限。 SQLite已被certificate可以处理10倍的stream量。
Sqlite是一个桌面或进程中的数据库。 SQL Server,MySQL,Oracle和他们的同事都是服务器 。
对于任何需要支持对数据存储的并发写入访问的应用程序来说,桌面数据库本身并不是一个好的select。 这在一定程度上包括有史以来创build的大多数网站。 如果你甚至不得不login任何东西,你可能需要写访问数据库。
SQLite的可伸缩性将高度依赖于所使用的数据,以及它们的格式。 我有一些超长的表格(GPSlogging,每秒一个logging)的一些艰难的经验。 经验表明,SQLite将分阶段放缓,部分原因是不断增长的二叉树持有索引的重新平衡(和时间戳索引,你只知道树会重新平衡很多,但它是至关重要的search)。 所以最后大约1GB(我知道这很棒),对于我来说,查询变得迟缓。 你的里程会有所不同。
有一件事要记住,尽pipe所有的吹牛,SQLite不是为数据仓库。 有不推荐用于SQLite的各种用途。 SQLite背后的好人说:
另一种查看SQLite的方法是这样的:SQLite不是用来replaceOracle的。 它旨在取代fopen()。
这导致了主要的争论(不是定量的,抱歉的,而是定性的),SQLite并不是所有的用途,而MySQL可以涵盖许多不同的用途,即使不是最理想的。 例如,你可以让MySQL存储Firefox cookies(而不是SQLite),但是你需要运行所有的服务。 另一方面,你可以在SQLite上运行一个交易网站(与许多人一样),而不是MySQL,但是需要大量的停机时间。
在回复GateKiller(上面)的时候,如果你在不使用SQL Transaction语句的情况下进行更新/插入,那么SQLLite将会“出现”缓慢。 如果你在事务中发送SQL,速度会更快。 大多数SQL服务器不需要这样的事情,但SQLlite,Firebird和JavaDB是一些需要正式交易…
请阅读: http : //www.sqlite.org/lang_transaction.html
我认为在服务客户hunderts(在数字1)Web服务器出现在后端与一个单一的连接到数据库,不是吗?
所以在数据库中没有并发访问,因此我们可以说数据库是以“单用户模式”工作的。 在这种情况下diskius多用户访问是没有意义的,所以SQLite和任何其他基于服务器的数据库一样工作。
我为我的论坛使用MySQL,大部分时间运行“show processlist”,在任何时候只有一个线程访问数据库。 我想知道SQLite如何在这种情况下行事。 并发度低但负载非常高。
想想这样。 每次有人使用SQL Lite时,SQL Lite都将被locking。 因此,如果您提供网页或具有多个并发用户的应用程序,则只能使用SQLLite一次使用您的应用程序。 所以正确的是一个缩放问题。 如果一个人的应用程序说一个音乐库里面有数百个标题,等级,信息,用法,播放时间,那么SQL Lite将会精美地扩展,如果不是数百万条logging(硬盘愿意)
另一方面,MySQL适用于所有人都将同时使用的服务器应用程序。 它不锁,它的大小非常大。 因此,对于您的音乐库MySql将被杀死,只有一个人会看到它,除非这是一个共享的音乐库,数千人添加或更新它。 那么MYSQL将是一个使用。
所以理论上MySQL比较好,然后Sqllite可以处理多个用户,但对于单个用户的应用程序来说是过度的。
真正的SQL Server是一个build立在SQLite上的数据库服务器。
SQLite的网站(你引用的部分)表明它可以用于各种多用户的情况。
我会说,它可以处理很多。 根据我的经验,这一直是非常快的。 当然,你需要为你的表build立索引,并且在对它进行编码时,你需要确保你使用了参数化查询等等。 基本上你可以用任何数据库来改善性能。