0

我正在尝试将大量数据批量插入 MYSQL 数据库,并且需要有关如何处理表列不够大以应对传入数据大小的情况的建议。

由于数据集非常大(超过 1Gb),我正在将输入数据流式读取到内存中。在某些时候,我“刷新”数据并尝试使用 jdbcTemplate.batchUpdate 将其插入表中。目标表的所有列都是 VARCHAR,并且假定大小为 50。这对于绝大多数数据来说已经足够了。但是,由于偶尔到达的数据大于 15,因此 INSERT 将失败(数据对于列来说太长)。

解决这个问题的最佳方法是什么?我不想盲目地使所有表列变大,因为这似乎是一种不能很好扩展的策略。由于数据的大小,我也不想预先解析数据。那么我应该等待失败,然后执行适当的“ALTER TABLE”并重新提交数据吗?是否可以缓存失败的项目,确定所需的列大小并仅重新提交失败的项目?

我正在寻找有关执行此操作的最佳方式的指针和一般建议。

谢谢。

4

2 回答 2

1

我相信您最好的选择是在将数据放入插入批次之前验证数据。这样,您可以拒绝字符串太长的对象或将字符串截断为所需的大小。

于 2011-05-26T17:14:04.193 回答
0

您表明您正在使用 MySQL 和 varchar 列。我不清楚当前列宽是 15 还是 50,但在任何一种情况下,使列定义为 varchar(255) 都不会降低性能。我认为这将使许多失败案例成功。

您没有说明要求是否所有数据都必须以不变的方式结束,或者您是否可以截断或修改数据以使其适合。假设您可以更改数据,这里有一些额外的想法:

对于处理仍然太长的数据,我喜欢 Olaf 的建议,即在包含在批处理中之前验证数据。我会在读取每条记录时对其进行验证,然后决定是将其添加到插入批处理中还是将其作为失败处理(存储在文件中?)。

此外,您并没有真正指出在读取数据之后和插入数据库之前对数据进行了多少处理。如果您没有做任何事情,那么也许您应该研究可用于 MySQL 的批量加载工具(我还不够熟悉,无法告诉您)。通常,这些工具能够为您处理这些类型的案例。

于 2011-05-27T16:04:13.547 回答