4

我正在开发一个电子邮件支持系统。每封存储的电子邮件都包含from_emailsubjectdate、一些标志和contents邮件的 。显然,邮件量可能很大,我们的系统主要关注最近的邮件(例如最近 14 天),而较旧的邮件被视为已归档。我们还想搜索、过滤一些标签等等。

对于电子邮件的列表视图,我们不需要考虑该content字段。我正在考虑两个选项,一个表中的所有数据,以及一个存储LONGTEXT电子邮件正文的单独表。

假设 SQLSELECT字段不包含该content字段,将其放在单独的表中是否更有效?显然,该LONGTEXT字段没有与固定长度的行数据一起存储,但我想它可以是交错的,因此必须为列表视图获取的页面数更大。

我正在使用 MariaDB 5.5.25 和 InnoDB 引擎。

4

1 回答 1

4

我在 MySQL 5.5 手册第 14.3.12.2 节中找到了这些信息。文件空间管理

如果 [an InnoDB] 行的长度小于半页,则所有行都本地存储在该页内。如果超过半页,则为外部页外存储选择可变长度列,直到该行适合半页。对于选择用于页外存储的列,InnoDB 将前 768 个字节本地存储在行中,其余的在外部存储到溢出页中。每个这样的列都有自己的溢出页面列表。768 字节的前缀伴随着一个 20 字节的值,该值存储列的真实长度,并指向存储其余值的溢出列表。

用更简单的英语来说,如果你创建一个只有一个主键和一个长文本的表,如果长文本大于 8000 字节(半页),InnoDB 将拆分行。

我的建议是将长文本放在存储的电子邮件表行的末尾,因为无论如何 InnoDB 可能会将该行拆分为长电子邮件。

将所有固定长度的列放在行的开头,将可变长度的列放在行的末尾是一种很好的数据库实践。

于 2013-07-10T13:52:50.550 回答