问题:
我有多个处理平面文件记录的并行进程。每个文件对应于电信系统中的给定接口(通过系统的消息被赋予32 位全球唯一标识符,并且可以在多个接口上存在给定消息的记录)。有一个处理每个文件的进程。
我们将接口称为:A、B 和 C。消息字符串可以根据编写它的接口而有所不同。我应该创建一个表来存储有关通过系统的每条消息的信息。因此,该表应包含(以及其他字段):id、message_on_A、message_on_B、message_on_C。我想避免相同ID的重复条目。
我尝试过的是以下内容:
- 将 id 设置为 PRIMARY KEY 并使用 INSERT ON DUPLICATE KEY UPDATE 命令为每个进程设置相应的消息字段
- 将 id 分解为多个部分,并将这些部分用作复合主键;其余与 1 相同。
- 存储所有记录,然后使用第二个查询提取每个 id 的所有信息(使用 GROUP BY ID 和 max(message_on_A)、max(message_on_B)、max(message_on_C))。没有为此方法定义主键。
这些方法都不够快。我正在寻找一种解决方案,它可以为 100 万个 id 实现大约 30 秒的运行时间(考虑到 3 个接口,因此有 300 万条记录)。
第一种和第二种方法在 MyISAM 表上完成了大约 400 秒的工作。我也尝试过 InnoDB,但速度要慢得多。
目前我正在考虑再次尝试方法 3,但我需要找到一个更快的查询(GROUP BY 和 max() 查询在我终止之前持续了 20 多分钟)
问题:任何人都可以为这个问题提出一个更好的模式吗?还有更好的查询?