在支持超过 5000 个用户的网络应用程序中,postgres 正在成为瓶颈。
添加新用户需要超过 1 分钟。(即使在优化和 Win 2k3 上)
那么,作为一个设计问题,哪些其他数据库可能更好?
在支持超过 5000 个用户的网络应用程序中,postgres 正在成为瓶颈。
添加新用户需要超过 1 分钟。(即使在优化和 Win 2k3 上)
那么,作为一个设计问题,哪些其他数据库可能更好?
很可能,它不是 PostgreSQL,而是您的设计。换鞋很可能不会让你成为更好的舞者。
你知道是什么导致缓慢吗?是争用、更新索引的时间、查找时间吗?在您尝试插入第 5001 个用户的同时,所有 5000 个用户是否都在尝试写入用户表?我相信这会导致问题。您可能必须使用一些经过调整以处理极端并发性的东西,例如 Oracle。
MySQL(有人告诉我)可以进行优化以比 PostgreSQL 进行更快的读取,但就它们支持的 #transactions/sec 而言,两者都非常快,而且听起来这不是你的问题。
PS 我们在评论中对不同的答案进行了一些讨论——请注意,世界上一些最大的、存储方面的数据库是使用 Postgres 实现的(尽管它们倾向于调整引擎的内部结构)。Postgres 可以很好地扩展数据大小,并发性比大多数都好,并且在您可以用它做什么方面非常灵活。
希望能给你一个更好的答案,技术发明30年后,我们应该能够让用户对系统的了解少一些,才能让系统顺利运行。但是,唉,我所知道的所有产品都需要进行广泛的思考和调整。我想知道 StackOverflow 的创建者是否可以分享他们如何处理数据库并发性和可扩展性?他们正在使用 SQLServer,我知道很多。
PPS 因此,如果有机会,我昨天一头扎进了 Oracle 的一个并发问题。我不完全确定我做对了,不是 DBA,但是这些人解释的是这样的:我们有大量进程连接到 DB 并检查系统字典,这显然会强制对其进行短暂锁定,尽管它只是一个阅读。解析查询做同样的事情..所以我们(在具有 1000 个对象的多 tera 系统上)有很多强制等待时间,因为进程将彼此锁定在系统之外。我们的系统字典也太大了,因为它包含每个分区的所有信息的单独副本,每个表可能有数千个。这与 PostgreSQL 并没有真正的关系,但要点是——除了检查你的设计,
请更改运行 Postgres 的操作系统 - Windows 端口虽然对扩展用户群非常有用,但仍无法与(更老和更成熟的)Un*x 端口(尤其是 Linux 端口)相提并论。
让我向您介绍一种最简单、最实用的方法来扩展几乎任何数据库服务器,如果数据库设计确实是最优的:只需将您的内存加倍即可立即提高性能。这就像魔术一样。
我认为你最好的选择仍然是 PostgresSQL。花时间确保您已正确调整您的应用程序。在你确信你已经达到了调整所能做的极限之后,开始缓存你能做的一切。之后,开始考虑转移到异步主从设置...此外,您是否在执行 OLTP 的同一数据库上运行 OLAP 类型的功能?
PostgreSQL 的扩展性比大多数都好,如果您要使用关系数据库,那么 Oracle 就是它。ODBMS可以更好地扩展,但它们也有自己的问题,因为它更接近于编程来设置一个。
雅虎使用PostgreSQL,这应该告诉你一些关于可伸缩性的事情。
如上所述,问题不在于您使用的特定数据库,即 PostgreSQL,而是以下之一:
找出正在发生的事情的一种实用方法是分析 PostgeSQL 日志文件并找出以下方面的查询:
快速回顾将告诉您将工作重点放在哪里,您很可能会很快解决您的问题。没有灵丹妙药,您必须做一些功课,但这与更改数据库供应商相比会很小。
好消息...有很多实用程序可以分析您的日志文件,它们易于使用并产生易于解释的结果,这里有两个:
首先,我会确保优化确实有用。例如,如果您有许多索引,有时添加或修改记录可能需要很长时间。我知道有几个大项目在 PostgreSQL 上运行,所以看看这个问题。
我建议在这里查找有关 PostgreSQL 性能的信息: http: //enfranchismind.com/blog/2006/11/04/postgres-for-the-win
你运行的是什么版本的PG?随着发布的进展,性能有了很大的提高。
嗨,以前我现在的公司也有同样的问题。当我第一次加入他们时,他们的查询量很大而且速度很慢。运行它们需要 10 分钟。我能够将它们优化到几毫秒或 1 到 2 秒。在那段时间里我学到了很多东西,我将分享其中的一些亮点。
首先检查您的查询。对您需要的所有表进行内部连接总是需要一些时间。我建议的一件事是始终从表格开始,您可以使用该表格实际将数据切割成您需要的数据。
例如 SELECT * FROM (SELECT * FROM person WHERE person ilike '%abc') AS person;
如果您查看上面的示例,这会将您的结果缩减为您知道需要的内容,并且您可以通过进行内部连接来进一步完善它们。这是加快查询速度的最佳方法之一,但剥猫皮的方法不止一种。我无法在这里解释所有这些,因为它们太多了,但是从上面的示例中,您只需要修改它以适应您的需要。
这取决于您的 postgres 版本。较旧的 postgres 会在内部优化查询。例如,在 postgres 8.2 及更低版本上,IN 语句比 8.4 慢。
解释分析是你的朋友。如果您的查询运行缓慢,请进行解释分析以确定是哪一个导致运行缓慢。
清理您的数据库。这将确保您的数据库上的统计信息几乎与实际结果相匹配。统计数据和实际数据的巨大差异将导致您的查询运行缓慢。
如果所有这些都对您没有帮助,请尝试修改您的 postgresql.conf。增加共享内存并尝试配置以更好地满足您的需求。
希望这会有所帮助,但当然,这些仅用于 postgres 优化。
顺便提一句。5000个用户并不多。我的数据库包含大约 20 万到 100 万用户的用户。
如果您确实想从 PostgreSQL 切换,Sybase SQL Anywhere 在TPC-C 基准测试列表中的价格/性能方面排名第 5 。它也是前 10 名中价格最低的选项(到目前为止),并且是唯一的非 Microsoft 和非 Oracle 条目。
它可以轻松扩展到数以千计的用户和数 TB 的数据。
全面披露:我在 SQL Anywhere 开发团队工作。
我们需要更多详细信息:您使用的是什么版本?服务器的内存使用量是多少?你在清理数据库吗?您的性能问题可能与 PostgreSQL 无关。
如果您有很多读写操作,您可能想尝试 MySQL,假设问题出在 Postgres,但您的问题是写入问题。
不过,您可能想要查看您的数据库设计,并可能考虑分片。对于一个非常大的数据库,您可能仍然需要查看上述 2 个问题。
根据手头的任务,您可能还想查看非 RDBMS 数据库服务器或面向文档的 Mensia 和 CouchDB。没有一种工具可以管理所有任务,因此请明智地选择。
只是出于好奇,您是否有任何可能导致此延迟的存储过程?