[英]How big can a MySQL database get before performance starts to degrade
MySQL 数据库什么时候开始失去性能?
我有我认为的大型数据库,大约有 1500 万条记录,占用了近 2GB。 根据这些数字,是否有任何动机让我清理数据,或者我是否可以安全地让它继续扩展几年?
物理数据库大小无关紧要。 记录的数量无关紧要。
根据我的经验,您将遇到的最大问题不是大小,而是您一次可以处理的查询数量。 很可能您将不得不转向主/从配置,以便读取查询可以针对从服务器运行,而写查询可以针对主服务器运行。 但是,如果您还没有准备好,您可以随时调整您正在运行的查询的索引以加快响应时间。 此外,您可以对 Linux 中的网络堆栈和内核进行大量调整,这将有所帮助。
我的容量高达 10GB,只有中等数量的连接,它可以很好地处理请求。
我会首先关注您的索引,然后让服务器管理员查看您的操作系统,如果所有这些都无济于事,那么可能是时候实施主/从配置了。
一般来说,这是一个非常微妙的问题,并非微不足道。 我鼓励您阅读mysqlperformanceblog.com和High Performance MySQL 。 我真的认为对此没有普遍的答案。
我正在开发一个项目,该项目有一个包含近 1TB 数据的 MySQL 数据库。 最重要的可扩展性因素是 RAM。 如果您的表的索引适合内存并且您的查询是高度优化的,那么您可以使用普通机器处理合理数量的请求。
记录的数量确实很重要,这取决于您的表的外观。 有很多 varchar 字段或只有几个 int 或 long 是不同的。
数据库的物理大小也很重要:例如,考虑备份。 根据您的引擎,您的物理数据库文件会增长,但不会缩小,例如使用 innodb。 因此,删除大量行无助于缩小您的物理文件。
这个问题有很多,在很多情况下,细节决定成败。
数据库大小确实很重要。 如果您有多个表的记录超过一百万,那么性能确实开始下降。 记录的数量当然会影响性能: MySQL 对于大表可能会很慢。 如果您达到了 100 万条记录,如果索引设置不正确(例如,“WHERE 语句”中的字段或连接中的“ON 条件”中的字段没有索引),您将遇到性能问题。 如果您达到 1000 万条记录,即使您的所有索引都正确,您也会开始遇到性能问题。 硬件升级——增加更多内存和更多处理器能力,尤其是内存——通常有助于通过再次提高性能(至少在一定程度上)来减少最严重的问题。 例如,Basecamp 数据库服务器的37 个信号从 32 GB RAM 变为 128 GB RAM 。
我会首先关注您的索引,而不是让服务器管理员查看您的操作系统,如果所有这些都无济于事,那么可能是时候进行主/从配置了。
确实如此。 通常有效的另一件事是减少重复使用的数据量。 如果您有“旧数据”和“新数据”,并且 99% 的查询都使用新数据,只需将所有旧数据移动到另一个表 - 不要查看它;)
-> 看看分区。
2GB 和大约 15M 的记录是一个非常小的数据库 - 我在奔腾 III(!)上运行了更大的数据库,一切仍然运行得非常快..如果你的速度很慢,那是数据库/应用程序设计问题,而不是 mysql一。
我目前正在 Amazon 的云基础设施上管理一个 MySQL 数据库,该数据库已增长到 160 GB。 查询性能很好。 成为噩梦的是备份、恢复、添加从属或其他任何处理整个数据集的事情,甚至是大表上的 DDL。 干净地导入转储文件已经成为问题。 为了使流程足够稳定以实现自动化,需要做出各种选择来优先考虑稳定性而不是性能。 如果我们不得不使用 SQL 备份从灾难中恢复,我们将会停机数天。
水平扩展 SQL 也非常痛苦,并且在大多数情况下会导致以您最初选择将数据放入 SQL 时可能不打算使用的方式使用它。 分片、读从站、多主站等,它们都是非常糟糕的解决方案,增加了您对数据库所做的一切的复杂性,而且没有一个能解决问题; 只能在某些方面减轻它。 我强烈建议当您开始处理这些类型的事情成为问题的大小的数据集时,考虑将您的一些数据移出 MySQL(或实际上任何 SQL)。
更新:几年后,我们的数据集已经增长到大约 800 GiB。 此外,我们有一个 200+ GiB 的表和一些 50-100 GiB 范围内的其他表。 我之前说的一切都成立。 它仍然表现得很好,但运行完整数据集操作的问题变得更糟。
谈论“数据库性能”是毫无意义的,“查询性能”在这里是一个更好的术语。 答案是:它取决于查询、它操作的数据、索引、硬件等。您可以了解将要扫描的行数以及将使用 EXPLAIN 语法的索引。
2GB 并不是真正的“大型”数据库——它更像是一个中等大小的数据库。
还要注意复杂的连接。 除了交易量之外,交易复杂性也是一个重要因素。
重构繁重的查询有时会带来巨大的性能提升。
我曾经被要求查看“停止工作”的 mysql。 我发现 DB 文件驻留在安装了 NFS2 且最大文件大小为 2GB 的 Network Appliance 文件管理器上。 果然,停止接受事务的表在磁盘上正好有 2GB。 但是关于性能曲线,我被告知它一直像冠军一样工作,直到它根本不起作用! 这段经历对我来说总是一个很好的提醒,即在你自然怀疑的维度之上和之下总是存在维度。
需要考虑的一点也是系统的目的和日常数据。
例如,对于一个带有GPS 汽车监控的系统,没有从汽车前几个月的位置查询相关数据。
因此,可以将数据传递到其他历史表以进行可能的咨询并减少日常查询的执行时间。
如果数据库设计不当,性能可能会在几千行的情况下下降。
如果你有合适的索引,使用合适的引擎(不要在需要多个 DML 的地方使用 MyISAM),使用分区,根据用途分配正确的内存,当然还有良好的服务器配置,MySQL 甚至可以处理 TB 级的数据!
总有办法提高数据库性能。
这取决于您的查询和验证。
例如,我使用了一个包含 100 000 种药物的表,该表有一列通用名称,其中该表中每种药物的字符超过 15 个。我放置了一个查询来比较两个表之间的药物通用名称。查询需要运行更多分钟。同样,如果您使用药物索引比较药物,使用 id 列(如上所述),只需几秒钟。
数据库大小在字节和表的行数方面很重要。 您会注意到轻型数据库和 blob 填充数据库之间的巨大性能差异。 一旦我的应用程序卡住了,因为我将二进制图像放在字段中,而不是将图像保存在磁盘上的文件中,而只将文件名放在数据库中。 另一方面,迭代大量行不是免费的。
不,这并不重要。 MySQL 的速度约为每秒 700 万行。 所以你可以扩展它很多
查询性能主要取决于需要扫描的记录数,索引在其中起到了很大的作用,索引数据大小与行数和索引数成正比。
带有索引字段条件和完整值的查询通常会在 1 毫秒内返回,但是 starts_with、IN、Between 显然包含条件可能需要更多时间扫描更多记录。
此外,您将面临 DDL 的许多维护问题,例如 ALTER,即使添加索引或新列,DROP 也会因更多实时流量而缓慢且困难。
通常,建议将数据库集群到所需数量的集群中(500GB 将是一个通用基准,正如其他人所说,它取决于许多因素,并且可以根据用例而变化),这样可以提供更好的隔离性并独立于特定的规模集群(更适合 B2B)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.