2012-08-10 9 views
5

Necesito insertar millones de filas en la base de datos MySQL (motor InnoDB). Tengo un problema con el tiempo cuando las tablas tienen tamaños grandes. Casi todo el tiempo se usa para insertar consultas. ¿Tal vez alguien sepa cómo optimizarlo?¿Cómo optimizar MySQL para insertar una fila de millones?

+0

¿cuál es su consulta? –

+0

¿Qué quieres decir? –

+0

¿Se realizan otras operaciones en la tabla mientras inserta los datos? – Kermit

Respuesta

14

Para importar gran volumen de datos en InnoDB:

  1. conjunto en la configuración de MySQL

    • innodb_doublewrite = 0
    • innodb_buffer_pool_size = 50% + sistema de memoria
    • innodb_log_file_size = 512M
    • log-bin = 0
    • innodb_support_xa = 0
    • innodb_flush_log_at_trx_commit = 0
  2. Agregar justamente después del lanzamiento de transacción:

    FOREIGN_KEY_CHECKS SET = 0;

    SET UNIQUE_CHECKS = 0;

    SET AUTOCOMMIT = 0;

  3. Conjunto justo antes de final de transacción:

    SET UNIQUE_CHECKS = 1;

    SET FOREIGN_KEY_CHECKS = 1;

+0

Estas optimizaciones me llevaron de hacer 10,000 registros cada 10 minutos a 500,000 registros, impresionante. – input

+0

También establezca 'sync_binlog = 0' en caso de que se establezca en' 1' ('0' es el valor predeterminado) – zogby

+0

@zogby con' log_bin = 0' binlog está completamente deshabilitado, por lo que 'sync_binlog = 0' no hace diferencia. – c2h5oh

0

Si habla de un gran número de declaraciones INSERT, investigue algo que se llama transacciones. Estoy bastante seguro de que la mayoría de los lenguajes (si no todos) que hacen SQL admiten transacciones. Acelerarán cualquier cosa que implique escribir en la base de datos. Una ventaja adicional es que si algo sale mal, puede deshacer los cambios.

+0

Ya estoy usando una transacción :) –

Cuestiones relacionadas