我在MySQL数据库中有一个2000万的记录表。 SELECT的工作非常快,因为我已经建立了良好的索引,但INSERT和UPDATE操作变得非常慢。该数据库是负载较重的Web应用程序的后端。 INSERT和UPDATE非常慢,因为这个表上有5个索引,索引大小现在大约是1GB - 我想计算需要花费很多时间。
为了解决这个问题,我决定对表进行分区。我运行MySQL 4,无法升级(没有直接控制服务器),所以我会做手动分区 - 为每个部分创建一个单独的表。
数据集由大约18000个不同的逻辑片组成,可以单独完成查询。因此,我可以创建18000个名为(maindata1,maindata2等)的表。但是,我不确定这是最佳方式吗?除了显而易见的事实,每当我想手动执行某些操作时,我将不得不浏览管理工具中的18000个项目,我担心文件系统性能。文件系统是ext3。我不确定在具有36000个文件的目录中查找文件的速度有多快(有数据文件和索引文件)。
如果这是一个问题,我可以将一些数据片段连接到同一个表中。例如:maindata10,maindata20等,其中maindata10将包含切片1,2,3 ... 10。如果我选择10个“团体”,我只会有1800张桌子。如果我组20,我会得900桌。
我想知道这个分组的最佳大小是什么,即目录中的文件数与表大小有什么关系?
编辑:我还想知道使用多个单独的数据库将文件组合在一起是否是一个好主意。所以,即使我有18000个表,我也可以将它们分组,例如,每个包含600个表的30个数据库。这似乎更容易管理。我不知道是否有多个数据库会增加或减少性能或内存占用(尽管会使备份和恢复变得复杂)
答案 0 :(得分:1)
您可以采取一些策略来提升效果。通过“分区”我假设你的意思是“具有相同列布局但数据内容不同的表的版本。”
如果可能的话,获取将运行mySQL 5的服务器。它在这个方面更快更好,足以让你在升级后没有问题。
您使用的是InnoDB吗?如果是这样,你可以切换到myISAM吗? (如果您需要严格的事务完整性,则可能无法切换)。
对于分区,您可能会尝试确定哪种数据切片组合将为您提供大致相等大小的分区(按行数)。如果我是你,我会去除不超过20个分区,除非你能证明自己需要。
如果只有少数数据切片正在被主动更新(例如,如果它们是“本月的数据”和“上个月的数据”),我可能会考虑将它们分成更小的切片。例如,您可能有“本周的数据“,”上周,“和”前一周“在他们自己的分区中。然后,当您的分区冷静下来时,复制他们的数据并将它们组合成更大的组,如”前一个季度。“这有不利之处它需要例行的星期日晚间风格维护工作才能运行。但它的优点是大多数或所有更新只发生在你桌子的一小部分上。
答案 1 :(得分:1)
如果你使用myISAM,你应该查看合并引擎,这样你就可以获得与mysql5分区相同的功能,你可以运行与现在运行相同的选择。