0

我有 2 个表,分别命名为:csv (a csv dump)items (primary data table)7M(csv 转储)和 15M 行。我需要更新itemstable 中存在的列csv

两个表都有一个共同索引的连接 ID (a VARCHAR(255))。

在相互 ID 列(索引)上具有连接的 UPDATE 查询仍需要数天才能运行。经过研究,我认为 MySQL 扫描csv表并对表进行每行随机访问查询的效率低下items

即使有索引,这些索引也不适合内存,因此所需的 7M 随机访问查询是鼻子潜水性能。

是否有解决此类问题的“典型”方法?


更新:

我们基本上采用多个“项目”目录并将它们存储在我们的items表中(这有点简化讨论)。比如说 10 个目录中的每一个都有 700 万个项目(我们在项目表中标准化为 1 行的目录中的一些重复项)。我们需要每天比较和验证对这 10 个目录的更改(UPDATESw/ 两个大表之间的连接,或其他此类机制)。

实际上,我们有一张items桌子和一张items_map桌子,但这里不需要讨论额外的抽象级别。我很乐意找到一种在csv转储表和items表之间执行更新的方法(假设它们都有一个在两个表中都编入索引的公共 ID)。但是假设该items表可能有 20M 行,而该csv表可能有 7M 行。

在这种情况下,索引不适合内存,我相信我们正在用随机搜索锤击驱动器

4

1 回答 1

0

好吧,我终于把这个查询放到了一个 8 核的盒子上,它有 12 GB 的内存,专门用于 InnoDB,它确实完成了,但在 7 小时后!

我们的解决方案:我们将这个过程从 MySQL 中移除。我们将使用 MapReduce (Hadoop) 以平面文件格式维护整个大表,并行执行主要更新过程,然后最终使用LOAD DATA INFILE快速更新表一次(〜每天)。

于 2012-10-14T10:10:07.190 回答