mysql - 当你在 MySQL 或 PostgreSQL 中有一个 TEXT 字段时,你应该把它放在一个单独的表中吗?

标签 mysql sql postgresql schema

我听说如果您有一个包含大量文本数据的 TEXT 列的表,那么将该列移动到一个单独的表中并通过 JOIN 将其获取到基本记录会提高性能。

这是真的吗?如果是,为什么?

最佳答案

不适用于 PostgreSQL,来自 the manual :

Very long values are also stored in background tables so that they do not interfere with rapid access to shorter column values.

因此大字符列(如TEXTVARCHAR 没有指定大小限制)远离主表数据存储。因此,PostgreSQL 内置了“将它放在一个单独的表中”的优化。如果您使用的是 PostgreSQL,请明智地安排您的表并将数据布局留给 PostgreSQL。

我不知道 MySQL 或其他 RDBM 如何安排它们的数据。

这种优化背后的原因是数据库通常会将每一行的数据保存在磁盘上的连续 block 中,以减少需要读取或更新行时的查找。如果您在一行中有一个 TEXT(或其他可变长度类型)列,那么该行的大小是可变的,因此需要更多的工作来从一行到另一行。类比是访问链表中的内容与访问数组之间的区别;对于链表,您必须一次读取三个元素才能到达第四个元素,对于数组,您只需从开头偏移 3 * element_size 字节,一步到位.

关于mysql - 当你在 MySQL 或 PostgreSQL 中有一个 TEXT 字段时,你应该把它放在一个单独的表中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5268523/

相关文章:

PostgreSQL 如何根据另一个表上的插入对一个表的列进行平均

java - 将数据库值获取到小程序中

sql - 如何简化包含许多内部选择的选择查询并提高 PostgreSQL 的性能

mysql - Joomla SQL 错误 0

mysql - 试图查询标记对象(多对多表)

c# - asp.net c#代码错误(mysql数据库连接)

mysql - 如何获取campaing_ids的前10条记录?

postgresql外键约束防止重复

php - 上传多张图片到mysql数据库

php - 使用 cURL 将外部文件保存到我的服务器