Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Precisa de um método eficiente de importação de arquivo CSV grande via PHP para várias tabelas MySQL


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.