当您在MySQL或PostgreSQL中有一个文本字段时,是否应该将其放在单独的表中?

当您在MySQL或PostgreSQL中有一个文本字段时,是否应该将其放在单独的表中?,mysql,sql,postgresql,schema,Mysql,Sql,Postgresql,Schema,我听说,如果您有一个包含文本列的表,该列将容纳大量文本数据,那么将该列移动到一个单独的表中,并通过与基记录的联接来获取该列,对性能来说会更好 这是真的吗?如果是,为什么?在某些情况下,这可能是真的。原因是假设您的桌子是: create table foo ( id serial primary key, title varchar(200) not null, pub_date datetime not null, text_content text ); 然后

我听说,如果您有一个包含文本列的表,该列将容纳大量文本数据,那么将该列移动到一个单独的表中,并通过与基记录的联接来获取该列,对性能来说会更好


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

在某些情况下,这可能是真的。原因是假设您的桌子是:

create table foo (
    id serial primary key,
    title varchar(200) not null,
    pub_date datetime not null,
    text_content text
);
然后执行如下查询:

select id, title, pub_date
  from foo;
如果该表中没有
text\u content
字段,您将不得不从磁盘加载更多的页面。查询优化最重要的是尽可能减少磁盘I/O

来自:

对于包含多个列的表,请执行以下操作: 减少查询的内存需求 不使用BLOB列, 考虑分解Bulb列 放入一个单独的表中并引用 它可以在需要时使用连接查询

不适用于PostgreSQL,来自:

很长的值也存储在后台表中,这样它们就不会干扰对较短列值的快速访问

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

我不知道MySQL或其他RDBMs是如何安排数据的

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