1

我在 MySQL 数据库中有一个 2000 万条记录表。SELECT 的工作速度非常快,因为我设置了良好的索引,但是 INSERT 和 UPDATE 操作变得非常慢。数据库是负载较重的 Web 应用程序的后端。INSERTs 和 UPDATEs 真的很慢,因为这个表上有大约 5 个索引,现在索引大小约为 1GB - 我想计算需要很长时间。

为了解决这个问题,我决定对表进行分区。我运行 MySQL 4,无法升级(无法直接控制服务器),所以我将进行手动分区 - 为每个部分创建一个单独的表。

数据集由大约 18000 个不同的逻辑切片组成,可以完全单独查询。因此,我可以创建 18000 个名为(maindata1、maindata2 等)的表。但是,我不确定这是最佳的方式吗?除了当我想要手动执行某项操作时我必须在管理工具中浏览 18000 个项目这一显而易见的事实之外,我还担心文件系统性能。文件系统是 ext3。我不确定在包含 36000 个文件(有数据文件和索引文件)的目录中定位文件的速度有多快。

如果这是一个问题,我可以将一些数据片连接到同一个表中。例如:maindata10、maindata20 等,其中 maindata10 将包含切片 1、2、3...10。如果我选择 10 人的“组”,我将只有 1800 张桌子。如果我将 20 人分组,我将获得 900 张桌子。

我想知道这个分组的最佳大小是多少,即目录中的文件数与表大小?

编辑:我还想知道使用多个单独的数据库将文件分组在一起是否是个好主意。因此,即使我有 18000 个表,我也可以将它们分组到 30 个数据库中,每个数据库有 600 个表。这似乎更容易管理。我不知道拥有多个数据库是否会增加或减少性能或内存占用(虽然它会使备份和恢复复杂化)

4

2 回答 2

1

如果您使用的是 myISAM,您应该查看合并引擎,这样您可以获得与 mysql5 分区几乎相同的功能,您将能够运行与现在运行相同的选择。

于 2011-07-26T22:01:03.520 回答
1

您可以遵循一些策略来提高性能。我假设“分区”是指“具有相同列布局但数据内容不同的表版本”。

如果可能的话,获取一个运行 mySQL 5 的服务器。在这方面它更快更好,足以让你升级后不会有问题。

你在使用 InnoDB 吗?如果是这样,您可以切换到 myISAM 吗?(如果您需要严格的事务完整性,您可能无法切换)。

对于分区,您可能会尝试弄清楚哪种数据切片组合将为您提供大致相等大小的分区(按行数)。如果我是你,我会选择不超过 20 个分区,除非你可以向自己证明你需要这样做。

如果只有少数数据切片正在积极更新(例如,如果它们是“本月的数据”和“上个月的数据”),我可能会考虑将它们分成更小的切片。例如,您可能有“本周的数据” ”、“上周”和“前一周”在他们自己的分区中。然后,当你的分区冷却时,复制它们的数据并将它们组合成更大的组,比如“前季度”。这样做的缺点是它会需要例行的周日晚上式维护工作才能运行。但它的优点是大多数或所有更新只发生在桌子的一小部分上。

于 2010-09-06T16:11:33.273 回答