Если у вас есть поле TEXT в MySQL или PostgreSQL, вы должны поместить его в отдельную таблицу? - PullRequest
6 голосов
/ 11 марта 2011

Я слышал, что если у вас есть таблица со столбцом TEXT, которая будет содержать большой кусок текстовых данных, для производительности лучше переместить этот столбец в отдельную таблицу и передать его через JOINs в базовую запись.

Это правда, и если да, то почему?

Ответы [ 3 ]

15 голосов
/ 11 марта 2011

Не с PostgreSQL, от руководство :

Очень длинные значения также хранятся в фоновых таблицах, чтобы они не мешали быстрому доступу к более коротким значениям столбцов.

Таким образом, большой символьный столбец (например, TEXT или VARCHAR без заданного ограничения размера) сохраняется вне данных основной таблицы. Итак, в PostgreSQL встроена оптимизация «поместите ее в отдельную таблицу». Если вы используете PostgreSQL, разумно расположите свою таблицу и оставьте расположение данных для PostgreSQL.

Я не знаю, как MySQL или другие RDBM упорядочивают свои данные.

Причина этой оптимизации заключается в том, что база данных обычно будет хранить данные для каждой строки в непрерывных блоках на диске, чтобы сократить поиск, когда строка должна быть прочитана или обновлена. Если в строке есть столбец TEXT (или другой тип переменной длины), тогда размер строки будет переменным, поэтому для перехода от строки к строке требуется больше работы. Аналогия была бы различием между доступом к чему-либо в связанном списке и доступом к массиву; со связанным списком вы должны прочитать три элемента по одному, чтобы перейти к четвертому элементу, с массивом, который вы только что сместили 3 * element_size байт с начала, и вы там за один шаг.

3 голосов
/ 11 марта 2011

Из руководства MySQL :

Для таблицы с несколькими столбцами, чтобы уменьшить требования к памяти для запросов, которые не используют столбец BLOB, рассмотрите возможность разделения столбца BLOB наотдельная таблица и ссылка на нее с запросом соединения при необходимости.

1 голос
/ 11 марта 2011

В некоторых случаях это может быть правдой. Причина в том, что, скажем, ваша таблица:

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. А оптимизация запросов заключается в том, чтобы максимально сократить дисковый ввод-вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...