什么样的数据量被认为对于MySQL来说太大了?

10
我正在寻找一个免费的SQL数据库来处理我的数据模型。该项目是一个生产数据库,工作在没有任何复制的本地网络中,不连接互联网。同时连接的应用程序数量将少于10个。
未来5年的数据量预测如下:
- 3个拥有1亿行的表 - 2个拥有5亿行的表 - 20个拥有不到1万行的表
我的第一个想法是使用MySQL,但我在网络上找到了几篇文章说MySQL不适合大型数据库。但是,在这种情况下,“大”是什么意思呢?
有人能告诉我MySQL是否能够处理我的数据模型吗?我看到Postgres会是一个好的替代方案,但需要花费很多时间进行调整以使其对大型表格有效。
我认为我的项目不会使用NOSQL数据库。我想知道是否有人有关于MySQL的经验可以分享。
更新:
数据库将被C#软件(最多10个同时)和Web应用程序(最多2-3个同时)访问。重要的是要提到,只有少量的更新会在大表上执行,只有插入查询。删除语句仅在20个小表中执行几次。大表经常用于选择语句,但最常见的方式是了解条目是否存在,而不是返回分组和排序的数据批。

3
不仅仅是大小的问题,实际上取决于您期望以何种方式访问数据以及应用程序的限制(选择、更新、删除等)。MySQL可以完美地处理您提到的记录数。 - elbuild
1
你所询问的很大程度上取决于硬件和使用场景,而不是你运行的软件类型。硬件将决定您想象中的系统速度。如果您需要检查所有数据,则使用RDBMS或NoSQL搜索或操作50GB的数据同样会很慢。基本上,如果没有硬件和使用情况,您无法真正对什么是可以和不可以做出适当的估计。此外,10亿行并不算多,跨越几个远程位置的数千兆字节的数据才是。 - N.B.
@elbuild,我已经更新了问题,并提供了有关访问数据库的方式以及将执行哪种类型的语句的更多信息。 - sdespont
3个回答

23

我在Percona工作,这是一家为MySQL解决方案提供咨询和其他服务的公司。

值得一提的是,我们已经与许多客户合作,他们使用MySQL处理非常大的数据库。数据量达到了几个TB,表格数量达到了数万个,有些表格甚至包含了数十亿行,每秒事务负载可达数万个请求。您可以通过阅读我们的客户案例研究来获得更多见解。

您描述了表格数量和行数,但没有说明如何查询这些表格。当然,人们可以以不良的方式查询只有几百行的表格,这种方式不利于扩展。但这对于任何数据库都是适用的,而不仅仅是MySQL。

同样地,人们也可以以高效的方式查询大小为TB级别的表格。这完全取决于您需要如何查询它。

您还必须设定特定的性能目标。如果您希望查询在毫秒内运行,那么这是具有挑战性但可行的,需要高端硬件。如果您的查询运行时间在几秒钟内就足够了,那么您对可扩展性的要求就可以放宽很多。

重点是,MySQL在这些情况下并不是一个限制因素,就像任何其他数据库选择一样。
关于您的评论。
MySQL在其默认存储引擎InnoDB中具有引用完整性检查。声称“MySQL没有完整性检查”是多年来经常重复的谣言。
我认为您需要停止阅读关于MySQL的肤浅或过时文章,阅读一些更完整和当前的文档。

非常感谢您详细的回答。我很高兴看到MySQL能够管理这么多的数据。我也在网上读到一些评论说MySQL没有数据库完整性检查。这是因为有些人不建议将MySQL用于生产数据库。这似乎很奇怪,您对此有什么看法? - sdespont
另外,我已经更新了问题,并提供了更多关于我需要访问数据库的方式的细节。 - sdespont
我必须使用公司现有的IT基础设施。服务器的操作系统将是Windows Server 2008。这对MySQL会造成问题吗? - sdespont
2
只有约6%的受访者表示他们在MySQL生产环境中使用Windows。MySQL在Windows上运行良好,但大多数人使用Linux,可能是出于文化原因和技术原因。如果您不能选择服务器操作系统,则这个问题并不重要。任何其他数据库在Windows上遇到的问题都与MySQL一样严重。 - Bill Karwin
2
我很惊讶的是人们经常阅读2002年的文章,而不检查它们是否仍然相关。虽然有一些不好,过时和错误的文章存在,它们不会提到版本号也没有帮助。我是一个快乐的Pg用户和开发者,但当人们说他们想要使用Pg因为“它有外键和RI约束”时,我真的很恼火。请认真加入我们这个时代。 - Craig Ringer

4
MySQL有两个重要的(且显著不同)数据库引擎——MyISAM和InnoDB。限制取决于使用情况——MyISAM是非事务性的,具有相对快速的导入功能,但过于简单(没有自己的内存缓存),并且在大于100MB的表上进行JOIN可能会很慢(由于MySQL规划器过于简单——哈希连接从5.6开始支持)。InnoDB是事务性的,在基于主键的操作上非常快,但导入较慢。
当前版本的MySQL没有像Postgres一样好的规划器(正在进步),因此复杂查询通常在PostgreSQL上更好,并且真正简单的查询在MySQL上更好。
PostgreSQL配置的复杂性是错误的。它比MySQL InnoDB配置简单得多——您只需要设置五个参数:max_connection、shared_buffers、work_mem、maintenance_work_mem和effective_cache_size。几乎所有内容都与服务器上可用的Postgres内存有关。通常工作5分钟。根据我的经验,100GB的数据库通常在Postgres上没有任何问题(可能也适用于MySQL)。有两个重要因素——您期望的速度以及您拥有多少内存和多快的IO。
对于大型数据库,您必须具备任何数据库技术的经验和知识。当您在内存中时,所有内容都很快,当比例数据库大小/内存更高时,您需要做更多的工作才能获得良好的结果。

谢谢您的答案,提供了非常有用的信息。由于我的大表的几乎所有字段都是外键,所以我不会使用MyISAM引擎。 - sdespont
1
我曾经花了数年时间使用Oracle,然后转向使用MySQL。现在我使用PostgreSQL。我可以向您保证,与其他数据库相比,PostgreSQL并不复杂。只是PostgreSQL的默认设置更安全,因此您需要在从远程服务器连接到它之前对postgresql.conf和pg_hba进行一些更改。同样,PostgreSQL中的默认设置(缓冲区)曾经很低,但现在已经改变了。如果您预计需要编写复杂的查询(WITH子句、递归等),那么PostgreSQL可能更好。而MySQL则可能更快速。 - Jayadevan
@Jayadevan 感谢您的评论。开发者的经验总是非常有用的。 - sdespont
请考虑您可能需要的数据类型。在日期/时间方面,MySQL 最近增加了微秒精度。http://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html 。IP 数据类型仍然不存在,而在 PostgreSQL 中已经存在很长时间。http://www.postgresql.org/docs/8.3/static/datatype-net-types.html。所有这些问题在我处理必须以毫秒精度捕获的设备数据时给了我很大的麻烦。 - Jayadevan

1
首先,MySQL的表大小仅受您的操作系统允许的文件大小限制所限制,这在现代操作系统上可以达到几个Terra字节。这不会带来任何问题。最重要的是像这样的问题:
  1. 您将运行哪种查询?
  2. 大型表记录是否经常更新或基本上是历史数据的档案?
  3. 您的硬件预算是多少?
  4. 您需要什么样的查询速度?
  5. 您是否熟悉表分区、归档表、配置调整?
  6. 您需要多快地写入(每秒钟预期插入次数)?
  7. 您将使用什么语言连接到数据库(Java、.net、Ruby等)?
  8. 您最熟悉哪个平台?
  9. 您是否会运行可能导致表扫描的查询,例如 '%something%',这将必须通过每一行并花费很长时间。
MySQL被Facebook、Google、Twitter等使用,它们的数据表通常非常大,一亿条记录在社交媒体时代并不算多。MySQL几乎没有什么缺点(虽然在大多数情况下我更喜欢PostgreSQL),例如通过添加新索引来更改大型表格可能会出现问题。如果您没有备份,这可能会导致公司停工几天。为什么NoSQL不是一个选择呢?有时混合方法是一个好选择,比如将关系业务逻辑放在MySQL中,将巨大的统计表放在NoSQL数据库(如MongoDB)中,可以通过添加新服务器来扩展(MySQL也可以,但更复杂)。现在MongoDB可以有一个索引列,可以以惊人的速度进行搜索。
总之:您需要先回答上述问题,才能做出明智的决策。如果您有大型表格,并且只搜索索引键,则几乎任何数据库都可以胜任 - 如果您预计未来会对结构进行许多更改,则需要使用不同的方法。
编辑: 根据您刚刚发布的更新,我怀疑您不会遇到问题。

谢谢你的回答,充满了需要思考的真正问题。我从未考虑过混合数据库。这可能是一个选择。 - sdespont
如果您使用C#,只需另一个数据上下文和连接字符串,就可以开始并且可以将表扩展到数十亿条记录。我正在使用这种方法来存储JSON Twitter文档,因为它们非常适合MongoDB,该数据库存储bson(二进制JSON)。 - Nikolai Manek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接