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

时间:2011-03-11 03:03:20

标签: mysql sql postgresql schema

我听说如果你有一个带有TEXT列的表,它将容纳大量的文本数据,那么将该列移动到一个单独的表中并通过JOIN将其传递给基本记录会更好。< / p>

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

3 个答案:

答案 0 :(得分:15)

不是来自the manual的PostgreSQL:

  

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

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

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

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

答案 1 :(得分:3)

来自MySQL Manual

  

对于包含多个列的表,to   减少查询的内存需求   不使用BLOB列,   考虑拆分BLOB列   进入一个单独的表并引用   它在需要时使用连接查询。

答案 2 :(得分:1)

在某些情况下,这可能是真的。原因是我们说你的表是:

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_content字段,则必须从磁盘加载更多页面。查询优化主要是将磁盘I / O降至最低。