这里有点二人行。我正在开发一个项目(PHP/Postgres),我正在将中等大小的 csv 文件加载到我们的系统中(5k - 100k 行)。这些 csv 记录将被插入到一个大约有 100 列(其中 7 列构成主键)的表中。这些文件不保证包含唯一的记录,需要根据需要对记录进行更新插入。
我已经实现了一个与此类似的 upsert,它使用准备好的语句来减少运行时间,并让系统每秒加载大约 800 条记录。这对于较小的文件来说已经足够了,但对于超过 100k 行的文件来说就不够了。
在分析我的代码时,我注意到大量时间用于简单地构建长 sql 准备语句,因此我决定使用 APC 用户缓存来缓存它们,从而显着提高我的运行时间。我还使用准备好的语句来提高性能。这大概是我如何实现这一点的。
所以这里有问题:
- 我是否应该积极地使用 APC 用户缓存来缓存任何可以不经常构建的特别大的构造?
- 是否有更有效的方法对 100 列、100k 行的文件执行 upserts?
- 我可以以不同的方式存储文件吗?(也许使用 hstore 来批量存储文件中除了 7-8 个更重要的列之外的所有列)