数据库
首页 > 数据库> > mysql – 如何在磁盘上存储longtext列?

mysql – 如何在磁盘上存储longtext列?

作者:互联网

我正在研究电子邮件支持系统.每个存储的电子邮件都包含from_email,主题,日期,一些标志和邮件内容.显然,邮件量可能很大,我们的系统主要关注最新的消息(例如,过去14天),旧的消息被认为是存档的.我们还想搜索,过滤某些标签等.

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

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

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

解决方法:

我在MySQL 5.5手册section 14.3.12.2. File Space Management中找到了这些信息

If [an InnoDB] row is less than half a page long, all of it is stored locally within the page. If it exceeds half a page, variable-length columns are chosen for external off-page storage until the row fits within half a page. For a column chosen for off-page storage, InnoDB stores the first 768 bytes locally in the row, and the rest externally into overflow pages. Each such column has its own list of overflow pages. The 768-byte prefix is accompanied by a 20-byte value that stores the true length of the column and points into the overflow list where the rest of the value is stored.

在简洁的英语中,如果您创建一个只包含主键和longtext的表,如果longtext大于8000字节(半页),InnoDB将拆分该行.

我的建议是将longtext放在存储的电子邮件表行的末尾,因为InnoDB可能会拆分长电子邮件的行.

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

标签:mysql,longtext
来源: https://codeday.me/bug/20190625/1283457.html