如何在MySQL表上拆分数据

时间:2008-11-27 04:30:40

标签: mysql scalability large-data-volumes

我有一个网站,其成员互相发送消息。会有几个成员,他们喜欢发送消息 - 我相信你可以看到它的发展方向。

目前我已经将消息存储在一个很好的关系表中,狡猾地标题为“消息”,具有不同的状态ID来表示,呃,状态(未读,保存等)。我知道这是事后的事,但我认为我真的需要将这个表分成其他几个(例如,每个状态类型不止一个),我不知道最好的方法是什么关于它。

我有几个想法,其中没有一个是火箭科学,但我很好奇这是否有'标准解决方案'。谷歌建议没有,但是我认为这些问题在stackoverflow之外并不常见。

任何人已经完成了吗?

3 个答案:

答案 0 :(得分:3)

我肯定会将'messages'表分成多个。例如:

MessageStatus 信息 MessageText中

这样,如果您在某个收件箱中显示项目列表,则只需扫描“消息”表,该表是较小且固定长度的列,以获得最大搜索速度。当有人想打开并查看邮件正文时,您可以点击“MessageText”表。 “消息状态”只是一个查找表,用于将一个tinyint FK加入到“消息”表中。

您可以在1个表上获得更多性能,可能是一个中等文本列。

答案 1 :(得分:0)

你有没有想过可能有一个存档过程可以存档任何旧的,然后存在一段时间?

通过适当的索引和微调,您将不得不有相当多的消息要求将它们移动到多个表中,除非它是空间问题。

答案 2 :(得分:0)

拥有包含大量数据的消息表没有任何问题。如果你真的不需要它,没有理由拆分它。

如果您担心此表的性能,请首先根据您的需要明智地选择您的存储引擎:我的建议是使用InnoDB,因为它将是写密集型的。然后查看索引以加快读取速度。

如果表格太大而且速度太快,你可以做的是创建2个表格:

  • 带有MyISAM存储的messages_archive表(仅用于快速检索和搜索“已存档”的消息)。

  • 带有InnoDB存储的messages_inbox表:这是经常插入新消息的表。

可选:

  • 一条messages_drafts,保留自动保存的邮件。原因:无需使用草稿消息减慢收件箱表。
顺便说一句,这不是你所说的“标准解决方案”,只是一个想法。 :)

编辑:

根据您的评论,我了解您所寻找的实际上是“Partitioning”。

不同的MySQL分区类型允许您按范围,列表,密钥或散列对数据进行物理隔离。