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

dan*_*dan 6 mysql sql postgresql schema

我听说如果你有一个TEXT列的表可以容纳大量的文本数据,那么将该列移动到一个单独的表并通过JOIN获取它到基本记录的性能会更好.

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

mu *_*ort 15

手册中没有PostgreSQL :

非常长的值也存储在后台表中,因此它们不会干扰对较短列值的快速访问.

因此,远离主表数据存储大字符列(例如TEXTVARCHAR没有指定的大小限制).因此,PostgreSQL将你的"把它放在一个单独的表中"优化内置.如果你正在使用PostgreSQL,请理智地安排你的表并将数据布局留给PostgreSQL.

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

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


Ted*_*opp 5

来自MySQL 手册

对于具有多个列的表,为了减少不使用 BLOB 列的查询的内存要求,请考虑将 BLOB 列拆分为单独的表,并在需要时通过联接查询引用它。