mysql - 数据库表分区选择哪个粒度?

标签 mysql partitioning ext3

我在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 张 table 。如果我将 20 个分组,我将得到 900 个表。

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

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

最佳答案

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

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

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

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

如果您的数据切片中只有少数被主动更新(例如,如果它们是“本月的数据”和“上个月的数据”),我可能会考虑将它们拆分成更小的切片。例如,您可能有“本周的数据”、“上周的”和“前一周”在它们自己的分区中。然后,当您的分区冷却下来时,复制它们的数据并将它们组合成更大的组,例如“上个季度”。这有缺点它需要例行的周日晚上式维护作业才能运行。但它的优势在于,大部分或所有更新只发生在表的一小部分。

关于mysql - 数据库表分区选择哪个粒度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3652401/

相关文章:

linux - SD卡写入性能

filesystems - 为什么没有适用于 Windows 的良好 extN 驱动程序?

php - 链式选择框 - 基本

java - 将一个数 n 分成两个数,使得两个数之和为 n

mysql - laravel - 查询构建器交叉连接子查询

Centos:将未分区空间添加到root

MySQL 更改表分区语法

linux - 制作 : can't find/usr/include/linux/ext3_fs. h

Mysql左连接和求和

php - 如何在自己的错误处理函数中使用 mysql_errno() ?