Soy un estudiante de posgrado que investiga OLAP con Mondrian OLAP. Entonces quiero insertar datos en InnoDB (MySQL 5.5) más rápido en la carga inicial. En este entorno, el único usuario soy yo, por lo que creo que puede permitir configuraciones más flexibles para la velocidad de inserción. Por el momento, estoy usando las siguientes técnicas.
- inhabilitar
log_bin
- habilitar
skip-innodb-doublewrite
- establecido
transaction_isolation
enREAD-COMMITTED
oREAD-UNCOMMITTED
(en realidadREAD-COMMITED
) - establecido
innodb_flush_log_at_trx_commit
en0
o2
(en realidad0
) - configurado
innodb_buffer_pool_size
a 5 GB (el sistema tiene 6 GB de RAM)
¿Hay más técnicas para una inserción más rápida en InnoDB? ¿Y tengo que modificar innodb_io_read_thread
y innodb_io_write_thread
? Si necesita más información, por favor dígame.
innodb_read_io_threads
,innodb_write_io_threads
y `innodb_io_capacity'.Hay un documento completo dedicado a la carga masiva de datos en InnoDB. Los puntos principales:
SET autocommit=0;...sql import;COMMIT;
deshabilitar las comprobaciones externas y únicas (no puede deshabilitar todos los índices por completo)
El tercero puede ayudarlo o no, por lo que le sugiero leer ese enlace para ver cómo está cargando los datos inicialmente. Por ejemplo, si está dividiendo las cargas en múltiples inserciones para que se ejecuten simultáneamente, definitivamente le ayudará a establecer el valor en 2. Si está haciendo una inserción grande de varias líneas, no hará mucho (si es que hay algo) para ayuda.
Dado que está convirtiendo el registro binario para esta inserción inicial, no debe preocuparse por los espacios en los números de incremento automático (si se realizan inserciones concurrentes).
fuente
Puede usar los siguientes métodos para acelerar las inserciones:
INSERT
declaraciones con variasVALUES
listas para insertar varias filas a la vez. Esto es considerablemente más rápido (muchas veces más rápido en algunos casos) que usarINSERT
declaraciones de una sola fila por separado . Si está agregando datos a una tabla no vacía, puede ajustar la variable bulk_insert_buffer_size para que la inserción de datos sea aún más rápida.LOAD DATA INFILE
. Esto suele ser 20 veces más rápido que usarINSERT
declaraciones. Verfuente
Plan A: INSERTOS "Batch": varias filas por instrucción INSERT. Sugerir alrededor de 1000 filas por declaración. autocommit = encendido, no explícito COMIENZO ... COMPROMISO
Plan B: CARGAR DATOS
Si inserta demasiadas filas a la vez, InnoDB debe hacer más trabajo para poder deshacer la inserción si se produce un bloqueo. Por esta razón, no estoy de acuerdo con autocommit = off, que pondría todo el conjunto en una sola transacción.
CARGAR DATOS de todo el conjunto de filas puede tener el mismo problema, pero es bastante rápido.
buffer_pool = 5G de 6G está a punto de ser demasiado grande. Si hay algún intercambio, el rendimiento se desplomará.
PARTICIONAR probablemente lo haría ir más lento.
MOSTRAR CREAR TABLA: las claves secundarias podrían ser una desventaja grave.
¿Estás usando InnoDB? o XtraDB?
fuente
LOAD DATA
parezca tan rápido, pero necesitamos escribir datos en el texto a la vez como CSV, luego usarLOAD DATA
¿no? / Voy a configurar elbuffer_pool_size
a 4GB.