MySQL, который является более эффективным длинным текстом, текстом или BLOB-объектами? Улучшение эффективности вставки - PullRequest
6 голосов
/ 19 июля 2011

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

Структура проста в новой таблице, которая называется migrate_data.Он состоит из идентификатора (первичный ключ), type_id (увеличивается в наборе типов данных), данных (поле, содержащее сериализованный объект PHP, содержащий переносимые мной данные), source_db (очевидно, относится к исходной базе данных), data_type(определяет тип данных, на который мы смотрим).

Я создал ключи и комбинации клавиш для всего, кроме поля данных.В настоящее время у меня есть поле данных в виде столбца длинного текста.Пользовательские вставки в среднем занимают около 4,8 секунд каждая.Я смог урезать это до 4,3 секунды, используя DELAY_KEY_WRITE = 1 для таблицы.

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

Прежде чем ответить, позвольте мне дать вам немного больше информации.Я отправляю все данные в функцию вставки, которая принимает объект, запускает его через сериализацию, а затем запускает вставку данных.Это также делается с использованием Drupal 6 (и его функции db_query).

Любые улучшения эффективности были бы потрясающими.

Текущая структура таблицы:

CREATE TABLE IF NOT EXISTS `migrate_data` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `type_id` int(10) unsigned NOT NULL DEFAULT '0',
  `data` longtext NOT NULL,
  `source_db` varchar(128) NOT NULL DEFAULT '',
  `data_type` varchar(128) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `migrated_data_source` (`source_db`),
  KEY `migrated_data_type_id` (`type_id`),
  KEY `migrated_data_data_type` (`data_type`),
  KEY `migrated_data_id__source` (`id`,`source_db`),
  KEY `migrated_data_type_id__source` (`type_id`,`source_db`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 DELAY_KEY_WRITE=1;

1 Ответ

14 голосов
/ 19 июля 2011

Различные типы текста / больших двоичных объектов одинаковы в требованиях к хранилищу в PHP и работают точно так же, за исключением того, что текстовые поля подлежат преобразованию набора символов.BLOB-полей нет.Другими словами, большие двоичные объекты предназначены для хранения двоичных файлов, которые ДОЛЖНЫ выходить точно так же, как и в исходных. Текстовые поля предназначены для хранения текстовых данных, которые могут / могут / будут преобразованы из одной кодировки в другую.

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