Хранить TEXT/BLOB в том же столе или нет? - программирование
Подтвердить что ты не робот

Хранить TEXT/BLOB в том же столе или нет?

Во время поиска корыта SO, я нашел два противоречащих ответа (и даже комментарий, который заявил об этом), но не дал окончательного ответа:

Проблема в том, есть ли какое-либо преимущество в производительности, если вы сохраняете поле TEXT/BLOB вне таблицы?

Предположим, что

  • ВЫ SELECT правильно (только выберите TEXT/BLOB, если требуется, нет SELECT *)
  • Таблицы индексируются правильно, где это имеет смысл (так что это не вопрос "если вы его индексируете" )
  • Дизайн базы данных не имеет большого значения. Это вопрос идентификации поведения MySQL в этом специальном случае, а не для решения некоторых проблем с дизайном базы данных. Предположим, что эта база данных имеет только одну таблицу (или две, если TEXT/BLOB разделяется)
  • используемый движок: innoDB (другие были бы интересны, если они принесли разные результаты)

В этом сообщении указано, что размещение текста в текстовой таблице в отдельной таблице помогает только в том случае, если вы уже выбрали неправильный путь (всегда ВЫБОР ТЕКСТА /BLOB, даже если это не нужно) - что TEXT/BLOB в той же таблице в основном является лучшим решением (меньше сложности, бездействия и т.д.), поскольку TEXT/BLOB хранится отдельно в любом случае

Единственный раз, когда перемещение столбцов TEXT в другую таблицу даст какую-либо выгоду, если есть тенденция обычно выбирать все столбцы из таблиц. Это просто введение второй плохой практики для компенсации первого. Разумеется, две ошибки не совпадают с тремя левыми.

Таблица MySQL с столбцом TEXT


В этом сообщении указано, что:

Когда таблица имеет столбцы TEXT или BLOB, таблица не может быть сохранена в памяти

Означает ли это, что этого уже достаточно, чтобы иметь TEXT/BLOB внутри таблицы, чтобы получить производительность?

MySQL varchar (2000) против текста?


Мой вопрос в основном таков: какой правильный ответ?

Действительно ли имеет значение, если вы храните TEXT/BLOB в отдельной таблице, если вы SELECT правильно?

Или даже имеет TEXT/BLOB внутри таблицы, создает потенциальную производительность?

4b9b3361

Ответ 1

Если вы используете версию MySQL, используйте формат файла Barracuda InnoDB, используя

innodb_file_format=barracuda

в вашей конфигурации MySQL и настройте свои таблицы с помощью ROW_FORMAT=Dynamic (или Compressed), чтобы фактически использовать его.

Это заставит InnoDB хранить BLOB, TEXT и большие VARCHAR за пределами страниц строк и тем самым сделать его намного более эффективным. Подробнее см. эту статью в блоге MySQLperformanceblog.com.

Насколько я понимаю, использование формата Barracuda сделает сохранение TEXT/BLOB/VARCHAR в отдельных таблицах более недействительным по причинам производительности. Тем не менее, я считаю, что всегда полезно поддерживать правильную нормализацию базы данных.

Ответ 2

Один прирост производительности - это таблица с фиксированными записями длины. Это означало бы отсутствие полей переменной длины, таких как varchar или text/blob. С фиксированными записями длины MySQL не должен "искать" конец записи, так как он знает смещение по размеру. Он также знает, сколько памяти потребуется для загрузки X-записей. Таблицы с записями фиксированной длины менее подвержены фрагментации, поскольку пространство, доступное из удаленных записей, может быть полностью использовано повторно. Таблицы MyISAM на самом деле имеют несколько других преимуществ от записей фиксированной длины.

Предполагая, что вы используете innodb_file_per_table, сохранение tex/blob в отдельной таблице увеличивает вероятность того, что кеширование файловой системы будет использоваться, поскольку таблица будет меньше.

Тем не менее, это микро-оптимизация. Есть много других вещей, которые вы можете сделать, чтобы получить гораздо больший прирост производительности. Например, используйте накопители SSD. Это не даст вам достаточного повышения производительности, чтобы вытолкнуть день расплаты, когда ваши таблицы станут такими большими, вам придется реализовать осколки.

Вы больше не слышите о базах данных, использующих "сырую файловую систему", даже если это может быть намного быстрее. "Сырье" - это когда база данных напрямую обращается к аппарату на диске, минуя любую файловую систему. Я думаю, что Oracle все еще поддерживает это. Но это просто не стоит дополнительной сложности, и вы должны действительно знать, что делаете. На мой взгляд, сохранение вашего текста /blob в отдельной таблице просто не стоит дополнительной сложности для возможного увеличения производительности. Вам действительно нужно знать, что вы делаете, и ваши шаблоны доступа, чтобы воспользоваться им.