Написах PHP скриптове за групово зареждане на данните, публикувани от Stack Overflow data dump. Внасям милиони редове и това не отнема толкова време.
Ето няколко съвета:
-
Не разчитайте на автоматично завършване. Разходите за стартиране и извършване на транзакция за всеки ред са огромни. Използвайте изрични транзакции и ангажирайте след всеки 1000 реда (или повече).
-
Използвайте подготвени изявления. Тъй като по същество правите едни и същи вмъквания хиляди пъти, можете да подготвите всяко вмъкване, преди да започнете цикъла, и след това да го изпълните по време на цикъла, като предавате стойности като параметри. Не знам как да направя това с библиотеката на базата данни на CodeIgniter, ще трябва да го разберете.
-
Настройте MySQL за импортиране. Увеличете кеш буферите и т.н. Вижте Скорост на инструкциите INSERT за повече информация.
-
Използвайте LOAD DATA INFILE. Ако е възможно. Това е буквално 20 пъти по-бързо от използването на INSERT за зареждане на данни ред по ред. Разбирам, ако не можете, защото трябва да получите последния идентификатор за вмъкване и т.н. Но в повечето случаи, дори ако прочетете CSV файла, го пренаредите и запишете в множество временни CSV файлове, зареждането на данните все още е по-бързо, отколкото при използването на INSERT.
-
Направете го офлайн. Не изпълнявайте дългосрочни задачи по време на уеб заявка. Срокът на PHP заявка ще прекрати заданието, ако не днес, то следващия вторник, когато заданието е с 10% по-дълго. Вместо това направете уеб заявката да постави заданието на опашка и след това върнете контрола на потребителя. Трябва да стартирате импортирането на данни като сървърен процес и периодично да позволявате на потребителя да види скоростта на напредък. Например, евтин начин да направите това е вашият скрипт за импортиране да изведе "." към временен файл, а след това потребителят може да поиска да види временния файл и да продължи презареждането в браузъра си. Ако искате да станете фантастични, направете нещо с Ajax.