MySQL数据库优化 - 我有一个包含大量重复项的消息表

时间:2014-09-03 10:20:48

标签: mysql optimization duplicates messages

我的数据库中有一个表用于消息。问题是每个收件人的每封邮件都有一行,即使他们收到相同的邮件。见下文:

|  ID  | RECIP_ID  | MESSAGE               |
|  1   | 366       | "URGENT REMINDER..."  |
|  2   | 367       | "URGENT REMINDER..."  |
|  3   | 368       | "URGENT REMINDER..."  |

因此,正如您所希望的那样,它是针对每个收件人保存的相同邮件。我确信这是非常低效的。最好的方法是什么?我想记录每个recip_id已发送的消息。

1 个答案:

答案 0 :(得分:1)

简而言之,我建议to normalize你的桌子。为了有效地存储数据,它要求您至少使用3个表:

  • 消息 (Id,Content,TimeStamp) - 存储消息
  • 收件人 (身份证等) - 存储收件人
  • RecipientMessages (MessageId,RecipientId) - 存储发往哪个收件人的邮件

选择 示例,它会在您上面的格式化时获取数据:

SELECT
   `r`.*,
   `m`.*
FROM
   `Messages` as `m`
        INNER JOIN `RecipientMessages` as `rm`
            ON `m`.`Id` = `rm`.`MessageId`
        INNER JOIN `Recipients` as `r`
            ON `rm`.`RecipientId` = `r`.`Id`

插入 示例,它可以让您了解如何编写数据:

START TRANSACTION;

INSERT INTO `Messages`
    (`Id`, `Content`, `TimeStamp`)
VALUES
    (NULL, 'URGENT REMINDER...', NOW());

INSERT INTO `RecipientMessages`
    (`MessageId`, `RecipientId`)
VALUES
    (LAST_INSERT_ID(), 366),
    (LAST_INSERT_ID(), 367),
    (LAST_INSERT_ID(), 368);

COMMIT;