根据您的经验,在具有 Q9650 CPU(4 核,3.0G)和 8G RAM 的服务器上,MySQL 可以有效处理 MyISAM 表中行的上限是多少。
我目前有一张 1500 万行的表。速度很快。如果规模增加到 10 亿行,我是否需要将其分成 10 个表,每个表 1 亿行?
答案1
在一台可以将索引保存在内存中的机器上,我不会担心 10 亿行数据的应用程序性能。如果你真的想达到 10 亿行,你首先必须做一些计算:
- 你的记录大小是多少?乘以10亿?
- 接下来,您需要计算索引的大小(我猜不止一个索引),然后将其添加上。
- 您是否有想要使用行级锁定的事务需求?
- 这是一个追加操作繁重的表,还是读取操作繁重的表?
接下来,进入您的应用程序正常运行时间要求。
- 您将如何备份 1B 行?
- 您将如何处理损坏的 1B 行表?
- 您需要多久运行一次 OPTIMIZE TABLE?
- 您将如何处理针对 1B 行表进行的架构更改?(最近,我在具有 2GB RAM 的 2GH 双核机箱上为 3500 万行表添加索引花了我 45 分钟。)
在担心性能之前,我会更担心这种规模的几 GB 表文件的数据生命周期和数据管理。通过复制,您可以弥补很多性能问题。保持数据健全并从即使是小灾难(如由坏内存引起的损坏)中恢复更有可能首先困扰您。
我还鼓励您使用现有的表格,并向其中添加 1B 行测试数据。这对于观察系统发生的情况非常有帮助。针对这个新的庞大数据集对查询运行一些 EXPLAIN。计算备份和恢复所需的时间。您可能需要调整一些要求。
这是一有趣的文章mysql 中大约有 10 亿行。
答案2
只是想补充一下上面的一些评论,我之前在四至强处理器上有过十亿行表,尽管有 32Gb RAM,而不仅仅是 8。
为了确保我们的性能良好,我们尽可能简化和规范化表格,使其保持精简,然后只在上面添加几个索引。对我来说,这些表格(真正大的表格)的主要目的只是写下时间序列数据。大量写入,全部按顺序进行,读取很少。必要的读取总是针对另一列或两列搜索特定时间,因此索引可以处理这个问题。
SAN 上保存的表由 SRDF 自动备份,一旦出现问题(磁盘已满等),大约需要 4 个小时才能修复。
答案3
取决于您正在运行的查询。如果您正在运行,SELECT * FROM table
它通常会比十秒的查询运行得快得多JOIN
。
答案4
取决于您的硬件、数据、您运行的查询以及您认为快速的查询。对于简单("select * from table where foo='bla'"
)查询,计算很简单:如果您的查询使用索引,并且该索引适合您的操作系统的文件系统缓冲区,那么它会很快。如果它不适合,查询运行速度会更慢(慢多少取决于 mysql 必须读取的数据量和磁盘的速度)
但是,我会使用符合 ACID 标准的数据库,比如 Postgres,来处理这样的表,你不会想修复一个有十亿行数据的表