Eu escrevi scripts PHP para carregar em massa os dados publicados pelo despejo de dados do Stack Overflow. Eu importo milhões de linhas e não demora muito.
Aqui estão algumas dicas:
-
Não confie no autocommit. A sobrecarga de iniciar e confirmar uma transação para cada linha é enorme. Use transações explícitas e confirme a cada 1.000 linhas (ou mais).
-
Use declarações preparadas. Como você está basicamente fazendo as mesmas inserções milhares de vezes, você pode preparar cada inserção antes de iniciar o loop e, em seguida, executar durante o loop, passando valores como parâmetros. Não sei como fazer isso com a biblioteca de banco de dados do CodeIgniter, você terá que descobrir.
-
Ajuste o MySQL para importação. Aumente os buffers de cache e assim por diante. Consulte Velocidade das instruções INSERT Para maiores informações.
-
Use LOAD DATA INFILE. Se possível. É literalmente 20x mais rápido do que usar INSERT para carregar dados linha por linha. Eu entendo se você não puder porque você precisa obter o último ID de inserção e assim por diante. Mas na maioria dos casos, mesmo se você ler o arquivo CSV, reorganizá-lo e gravá-lo em vários arquivos CSV temporários, o carregamento de dados ainda será mais rápido do que usar INSERT.
-
Faça off-line. Não execute tarefas de longa duração durante uma solicitação da Web. O limite de tempo de uma solicitação PHP encerrará o trabalho, se não for hoje, na próxima terça-feira, quando o trabalho for 10% mais longo. Em vez disso, coloque a solicitação da Web na fila do trabalho e, em seguida, devolva o controle ao usuário. Você deve executar a importação de dados como um processo de servidor e permitir periodicamente ao usuário vislumbrar a taxa de progresso. Por exemplo, uma maneira barata de fazer isso é fazer com que seu script de importação produza "." para um arquivo temporário e, em seguida, o usuário pode solicitar a visualização do arquivo temporário e continuar recarregando em seu navegador. Se você quer ser chique, faça algo com o Ajax.