Подтвердить что ты не робот

Какой тип данных столбца я должен использовать для хранения больших объемов текста или html

У меня есть столбец в таблице, который раньше был varchar (255), и из-за некоторых изменений в дизайне теперь это varchar (1536) = 1024 + 512. Я не буду искать или индексировать это поле, имеет смысл хранить это значение в другом типе данных, отличном от varchar, если вы хотите оптимизировать это для производительности?

4b9b3361

Ответ 1

Да, будет лучше, если вы сохраните значения в типе данных "TEXT". Для получения дополнительной информации, пожалуйста, прочитайте в этой статье.

Что касается знаний о требованиях к хранению, вы можете прочитать этот.

Надеюсь, что это поможет.

Ответ 2

Вы должны использовать TEXT, как и другие, но есть несколько важных советов при каждом использовании TEXT или BLOB: отделить их от базовой таблицы, поскольку они действительно замедляют доступ к таблице. Представьте себе следующую структуру:

CREATE TABLE article (
    id INT(10) UNSIGNED,
    title VARCHAR(40),
    author_id INT(10) UNSIGNED,
    created DATETIME,
    modified DATETIME
);

CREATE TABLE article_body (
    id INT(10) UNSIGNED,
    body TEXT
);

Всякий раз, когда вы публикуете статьи, вы можете использовать таблицу article (последние 5 статей автора 33):

SELECT id, title FROM article WHERE author_id=33 ORDER BY created DESC LIMIT 5

И когда кто-то действительно открывает статью, вы можете использовать что-то вроде:

SELECT a.title, ab.body
FROM article AS a
   LEFT JOIN article_body AS ab ON ab.id = a.id
WHERE a.id=82

Ответ 3

Вы должны использовать файл, а не базу данных для его хранения. Особенно не MySQL. Я сделал запись, объясняя, что произойдет, если вы, например, загрузите изображения из базы данных BLOB, см. http://mysqldump.azundris.com/archives/36-Serving-Images-From-A-Database.html. Используя файлы, вы можете использовать быстрый путь веб-сервера, используя системный вызов sendfile (2), и использовать его гораздо быстрее.

У MySQL также нет BLOB API. Это означает, что невозможно загрузить или загрузить объекты, большие, чем max_allowed_packet, и работать с ним с помощью SUBSTRING() сложно, потому что это сделает ненужные копии строк в памяти сервера.

Если вы абсолютно ДОЛЖНЫ хранить данные BLOB или TEXT на сервере, у вас есть выбор TINYTEXT, TEXT, MEDIUMTEXT и LARGETEXT, которые ограничены 255, 65535, 16 МБ и 4 ГБ данными на сервере, дополнительно ограниченные max_allowed_packet.

Большая информация о BLOB или TEXT полностью разрушит плотность данных в вашей таблице. Полезно создать искусственную связь 1:1 или 1: 0 с таблицей BLOB, а затем сохранить капли в этой дополнительной таблице.

Когда MySQL показывает план запросов, который использует "tempoary", это означает, что серверу необходимо материализовать таблицу набора результатов на сервере перед доставкой результата. Это делается с использованием таблиц MEMORY, если это возможно. Любой тип TEXT или BLOB не может быть представлен в таблицах MEMORY, поэтому временная таблица затем обращается к диску как таблица MyISAM.

Вам нужно отсканировать такие планы запросов и преобразовать их во что-то, загружающее значения идентификатора значений BLOB/TEXT. Во втором запросе вы должны выбрать SELECT id, text FROM texttable WHERE id (...), чтобы получить значения TEXT/BLOB. Это сделает запрос с использованием "временного" не использовать типы TEXT или BLOB, и вы можете получить поля TEXT с помощью тривиального запроса, который выполняется без "использования временных".

Вы можете узнать больше о внутренностях хранилища MySQL TEXT и BLOB, прочитав http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/

Ответ 4

Я бы использовал text для столбцов с переменной длиной.