我正在开发电子邮件支持系统。每个存储的电子邮件都包含from_email
,subject
,date
,一些标记和邮件的contents
。显然,邮件量可能很大,我们的系统主要关注最新的消息(例如,过去14天),旧的消息被认为是存档的。我们还想搜索,过滤某些标签等。
对于电子邮件的列表视图,我们不需要考虑content
字段。我正在考虑两个选项,一个表中的所有数据,以及一个存储LONGTEXT
电子邮件正文的单独表。
假设SQL SELECT
字段不包含content
字段,将它放在单独的表中会更有效吗?显然,LONGTEXT
字段不与固定长度的行数据一起存储,但我想它可以是交错的,因此列表视图必须获取的页面数量更大。
我正在使用MariaDB 5.5.25和InnoDB引擎。
答案 0 :(得分:4)
我在MySQL 5.5手册section 14.3.12.2. File Space Management
中找到了这些信息如果[一个InnoDB]行长度不到半页,则所有行都存储在页面内。如果它超过半页,则选择可变长度列用于外部页外存储,直到该行适合半页。对于选择用于页外存储的列,InnoDB将本地的前768个字节存储在行中,其余部分存储在溢出页中。每个这样的列都有自己的溢出页列表。 768字节的前缀伴随着一个20字节的值,该值存储列的真实长度并指向溢出列表,其中存储了值的其余部分。
在简洁的英语中,如果您创建一个只包含主键和longtext的表,如果longtext大于8000字节(半页),InnoDB将拆分该行。
我的建议是将longtext放在存储的电子邮件表行的末尾,因为InnoDB可能会拆分长电子邮件的行。
将所有固定长度的列放在行的开头,将可变长度的列放在行的末尾是一种很好的数据库实践。