MySQL inserir linhas de 20K numa única inserção

Na minha mesa, coloco cerca de 20 mil filas em cada carga. Neste momento, estou a fazê-lo um a um. A partir do site mysql eu vim a saber que inserir várias linhas com uma única consulta inserir é mais rápido.

Posso inserir os 20000 numa única consulta?

o que acontecerá se houver erros nestas 20000 linhas? como é que o mysql vai lidar com isso?

Author: josliber, 2014-03-04

3 answers

Se estiver a inserir as linhas de alguma outra tabela, então poderá usar o inserir ... Seleccionar padrão para inserir as linhas.

No entanto, se estiver a inserir os valores usando o padrão INSERT ... VALUES, então terá o limite de max_ allowed_packet.

Também do docs: -

Para optimizar a velocidade de inserção, combine muitas pequenas operações num único grande operação. Idealmente, você faz uma única conexão, envia os dados para muitas linhas novas ao mesmo tempo, e atrasar todas as actualizações de índices e consistência a verificar até ao fim.

Exemplo: -

INSERT INTO `table1` (`column1`, `column2`) VALUES ("d1", "d2"),
                                                 ("d1", "d2"),
                                                 ("d1", "d2"),
                                                 ("d1", "d2"),
                                                 ("d1", "d2");

O que acontecerá se houver erros nestas 20000 linhas?

Se houver erros ao inserir os registos, a operação será interrompida.

 7
Author: Rahul Tripathi, 2014-03-04 06:02:20

Http://dev.mysql.com/doc/refman/5.5/en/insert.html

Inserir declarações que usam valores a sintaxe pode inserir várias linhas. Para faça isso, inclua várias listas de valores de colunas, cada uma incluída dentro parênteses e separados por vírgulas.

Exemplo:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

Pode usar o código para gerar a secção inserir VALUES com base na sua fonte de dados.

Erros: Se houver erros na Declaração INSERT (incluindo em qualquer uma das linhas) a operação será interrompida.

Gerando a consulta - isso será baseado em sua fonte de dados, por exemplo, se você está recebendo dados de uma matriz associativa em PHP, você vai fazer algo assim:

$sql = "INSERT INTO tbl_name (a, b, c) VALUES ";
foreach($dataset as $row)
{
    $sql .= "(" + $row['a'] + ", "  + $row['a'] + ", "  + $row['a'] + ")";
    // OR
    $sql .= "($row[a], $row[b], $row[c])";
}

Mais alguns recursos:

Optimize As Consultas MySQL-Inserções Rápidas Com Várias Linhas

A maneira mais rápida de inserir 100K recordes

 3
Author: Joshua Kissoon, 2014-03-04 06:30:36

Lote inserir com SQL: inserir no quadro (col...coln) values (col... coln), (col...coln)... mas o tamanho do SQL é limitado por padrão de 1M, você pode alterar o parâmetro max_ allowed_ Packet para suportar uma única inserção maior

 1
Author: 马元生, 2014-03-04 06:09:16