Инкрементное замедление импорта MySQL CSV (альтернативы?) - PullRequest
0 голосов
/ 26 мая 2011

У меня есть следующая таблица:

CREATE  TABLE `Product_Category_Rank` (
  `CategoryId` SMALLINT(5) UNSIGNED NOT NULL ,
  `ProductId` VARCHAR(32) NOT NULL ,
  `RankedOn` DATE NOT NULL ,
  `PopularityRank` SMALLINT(5) NOT NULL ,
  PRIMARY KEY (`CategoryId`, `ProductId`, `RankedOn`) ,
  INDEX `fk_Product_Category_Rank_Product` (`ProductId` ASC) ,
  INDEX `fk_Product_Category_Rank_Category` (`CategoryId` ASC) ,
  CONSTRAINT `fk_Product_Category_Rank_Category`
    FOREIGN KEY (`CategoryId` )
    REFERENCES `Category` (`CategoryId` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Product_Category_Rank_Product`
    FOREIGN KEY (`ProductId` )
    REFERENCES `Product` (`ProductId` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci

У меня есть файл CSV (который я импортирую ежедневно), который содержит чуть менее 30 000 записей.

Я пробовал:

LOAD DATA LOCAL INFILE 'temp/product_category_rank.csv'
INTO TABLE `Product_Category_Rank`
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\n';

Также я попытался загрузить файл во временную таблицу и выполнить:

INSERT
  INTO `Product_Category_Rank` ( ... )
SELECT ...
  FROM `tmp_product_category_rank`

Оба метода работают одинаково (одинаковые результаты), однако второй, я уверен, имеет немного более высокую стоимость ресурсов. Проблема, с которой я сталкиваюсь, заключается в том, что каждый день время импорта в функции загрузки / вставки-выбора увеличивается примерно на 3 секунды в день. Итак, день 30, я смотрю 90 секунд, чтобы выполнить прямой импорт в таблицу.

Факты: при импорте никогда не будет дублированных первичных ключей (если, конечно, я не пытаюсь импортировать одни и те же данные дважды, что не является проблемой)

Так есть ли способ ускорить этот процесс (возможно, отключить проверку ключа перед импортом? (Как?))

edit: Также следует отметить, что проверки внешнего ключа также не требуются, так как таблицы Category и Product уже были обновлены, и ограничения внешнего ключа не являются проблемой при импорте.

1 Ответ

1 голос
/ 27 мая 2011

Решение: (очевидно, не имеет никакого отношения к запросу)

Переменные сервера MySQL:

innodb_buffer_pool_size = 8 МБ (изменено на 2 ГБ) innodb_log_file_size = 5 МБ (изменено на 256 МБ)(изменено до 4 МБ) innodb_flush_log_at_trx_commit = 1 (изменено на 2)

Эти новые настройки основаны на статье, найденной по адресу: http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

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

...