Я работаю над программой PHP / mysql, для которой требуется собственная таблица mysql, и я хочу включить пример базы данных для целей тестирования / обучения.
Я хочу использовать скрипт установки PHP для автоматизации создания таблицы MySQL и вставки примера базы данных.
В последних версиях mysql теперь установлен тип движка InnoDB, и я могу успешно создать базу данных mysql с использованием PHP — по умолчанию используется тип InnoDB.
Проблема возникает, когда я пытаюсь импортировать пример базы данных (из файла csv) — из 1800 записей только 500 записей импортируются до истечения времени ожидания PHP.
Я придумал возможное решение.
Создайте базу данных mysql с типом MyISAM — используя CREATE TABLE $ table_name …… ENGINE = MyISAM
Импортируйте записи из файла csv в таблицу MyISAM — используя INSERT INTO $ table_name …….
Наконец, измените тип базы данных с MyISAM на InnoDB — используя ALTER TABLE $ table_name ENGINE = InnoDB
Этот трехэтапный процесс работает НАМНОГО быстрее и завершается задолго до истечения времени ожидания сценария PHP.
Я проверил таблицу InnoDB и данные с помощью phpmyadmin, и все, кажется, в порядке.
Может ли кто-нибудь найти ошибку в этом методе, и если да, то можете ли вы предложить простое решение.
Обработка была бы еще быстрее, если бы вы не делали так много работы.
LOAD DATA INFILE ...
загрузит весь файл CSV за один шаг, без необходимости открывать + читать + разбирать + INSERT
каждый ряд один за другим.
Если вам нужно манипулировать любым из столбцов, то эти шаги более общие, но все же намного быстрее, чем любой из ваших методов:
CREATE TABLE tmp ... ENGINE=CSV; -- and point to your file
INSERT INTO real_table
SELECT ... the columns, suitably manipulated in SQL
FROM tmp;
Нет петли, нет OPEN, нет парсинга.
Это происходит со всеми установками apache php и mysql. Вам нужно увеличить максимальное время выполнения Apache, чтобы заставить php загружать большие файлы в mysql.
Я бы порекомендовал вам внимательно изучить файл php.ini и понять, как он контролируется в бэкэнде.