En mi aplicación, mis INSERT parecen ocupar una parte importante del tiempo. Tengo una gran cantidad de objetos en la memoria (~ 40-50,000) que quiero insertar en una tabla.
Tomemos una tabla de muestra
CREATE TABLE bill (
id BIGINT(20) PRIMARY KEY,
amount INT(11) DEFAULT 0,
bill_date DATETIME DEFAULT NOW(),
INDEX (bill_date)
) ENGINE=InnoDB
Tomando 3 filas como mi tamaño de lote, los siguientes son los enfoques que podría pensar para insertar
Enfoque 1: construya y dispare 3 insertos crudos
INSERT INTO bill (amount, bill_date) VALUES (10, '2012-01-01 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (20, '2012-01-02 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (40, '2013-02-05 00:00:00');
Enfoque 2: agrupar los valores en 1 consulta
INSERT INTO bill (amount, bill_date) VALUES
(10, '2012-01-01 00:00:00'),
(20, '2012-01-02 00:00:00'),
(40, '2013-02-05 00:00:00');
Enfoque 3: active esta consulta 1 vez pasando 6 parámetros
INSERT INTO bill (amount, bill_date) VALUES
(?, ?), (?, ?), (?, ?);
Enfoque 4: active esta consulta preparada 3 veces cambiando los 2 parámetros cada vez
INSERT INTO bill (amount, bill_date) VALUES (?, ?);
Cualquier otro enfoque es bienvenido.
Mi pregunta es
¿Cuál es la forma más rápida de hacer múltiples inserciones en una tabla?
He leído este enlace sobre la velocidad de inserción de mysql y esta guía de programación JDBC , pero no puedo llegar a una conclusión.
Mi caso -
Actualmente mi tabla tiene ~ 20 columnas, la mayoría de las cuales son números, con un par de varchar (60) y 1 columna de texto. Mysql versión 5.5. Se ejecuta en INNODB y tiene 1 índice en las claves primarias de enteros. Todas las consultas se ejecutan en la transacción.
Construyo mis consultas desde Java y uso Spring JDBC para ejecutar las consultas.
Actualmente estoy siguiendo el Enfoque 3, está tomando alrededor de 10 segundos para 20,000 inserciones en una tabla vacía, sin incluir el tiempo que lleva construir la consulta.
Para mantener las cosas en perspectiva, se necesitan entre 100 y 200 milis para obtener los datos de la tabla.
Hay algo que este olvidando? ¿Como hago los insertos más rápido?