我听说如果您有一个包含大量文本数据的 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.
因此大字符列(如TEXT
或VARCHAR
没有指定大小限制)远离主表数据存储。因此,PostgreSQL 内置了“将它放在一个单独的表中”的优化。如果您使用的是 PostgreSQL,请明智地安排您的表并将数据布局留给 PostgreSQL。
我不知道 MySQL 或其他 RDBM 如何安排它们的数据。
这种优化背后的原因是数据库通常会将每一行的数据保存在磁盘上的连续 block 中,以减少需要读取或更新行时的查找。如果您在一行中有一个 TEXT(或其他可变长度类型)列,那么该行的大小是可变的,因此需要更多的工作来从一行到另一行。类比是访问链表中的内容与访问数组之间的区别;对于链表,您必须一次读取三个元素才能到达第四个元素,对于数组,您只需从开头偏移 3 * element_size
字节,一步到位.
关于mysql - 当你在 MySQL 或 PostgreSQL 中有一个 TEXT 字段时,你应该把它放在一个单独的表中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5268523/