Преобразование MyISAM в InnoDB в MySQL - PullRequest
0 голосов
/ 18 августа 2011

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

Я заново создалта же схема БД с InnoDB, но на этот раз я поместил внешние ключи в операторы создания и определил правила обновления / удаления.

Я загружаю около 200 000 записей в БД с помощью PHP из файла CSV.Первоначально это заняло несколько минут, но с тех пор, как я перешел на InnoDB, через 10 минут сценарий PHP отключился, и было обработано всего ~ 7% файла CSV.однако лучшим решением (если это возможно) будет использование MyISAM при первоначальном заполнении базы данных, а затем переключение обратно на InnoDB и разрешение MySQL наладить отношения.Я не знаю, возможно ли это, но я предполагаю, что если это так, MySQL может исправить свои собственные внутренние структуры данных быстрее, чем вставка PHP один за другим.

Еще одна вещь, которую следует учитывать, это то, что примернораз в год нам нужно будет повторно загружать набор из 200 000 записей и определять, какие из них изменились.Вероятно, было бы невозможно переключаться с одного движка на другой, когда нам нужно было сделать это.

Есть какие-нибудь указатели?

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

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

INSERT INTO `table` (field1, field2, field3) 
VALUES
(value, value, value),
(value, value, value),
(value, value, value);

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

ALTER TABLE `table` ENGINE = innodb;
2 голосов
/ 18 августа 2011

Сложно сказать, что вы могли делать неправильно, не глядя на код, но можно попробовать пару вещей:

  1. Запустите SET foreign_key_checks = 0; перед началом загрузки и затем SET foreign_key_checks = 1; послевы закончили загрузку, чтобы ускорить время вставки.
  2. Убедитесь, что вы выполняете массовые вставки в транзакции, чтобы не выполнять автоматическую фиксацию каждый раз.

См.если это поможет.

...