2012-06-12 18 views
5

Tengo que escribir en la base de datos MySQL una gran cantidad de datos durante aproximadamente 5 veces por segundo. ¿Cuál es la manera más rápida: insertar cada 1/5 de segundo o hacer una cola e insertar todos los datos almacenados cada ~ 5 segundos? Si la segunda forma es mejor, ¿es posible insertarla en 1 tabla usando 1 solicitud de algunas filas?Inserción en la base de datos

Respuesta

2

Teniendo en cuenta la frecuencia de las inserciones Su mejor a ir con el segundo enfoque que está haciendo cola y que agregar de una sola vez.!

Pero Debe tener en cuenta estos escenarios primera:

  1. es su sistema en tiempo real.? Sí, entonces, ¿cuál es la demora máxima que puede permitirse (ya que demorará ~ 5 segundos para que la siguiente inserción y datos sean persistentes/disponibles)?

  2. ¿Cuáles son las posibilidades de que aparezcan valores/errores incorrectos en los datos, como si un dato fuera incorrecto perderá todo el resto si la consulta tiene que fallar?

+0

Sí, el sistema es en tiempo real. Los datos son una base64 simple con ~ 100 bytes de datos. – Ockonal

+2

En caso afirmativo, iría con una sola inserción y con Connection Pooling en la capa DAO. Debido a que no puede permitirse perder datos en RTS, el tiempo también es crítico. Espero que esto te haya ayudado. :) –

+0

Gracias por la ayuda;) – Ockonal

2

Uso de varias agrupaciones de almacenamientos intermedios con innodb_buffer_pool_instances. puede depender de la cantidad de núcleos en la máquina. Use Partitioning de la tabla.
Puede insertar datos colectivamente usando XML.

1

Puede hacer un inserto con todos los datos witho algo como esto:

INSERT INTO table (field1, field2,... , fieldN) 
VALUES 
(value1_1', value1_2,... , value1_N), 
(value2_1', value2_2,... , value2_N), 
... 
(valueM_1', valueM_2,... , valueM_N); 
2

Como cada transacción tiene un costo fijo, yo diría que el hacer una multilínea insertar cada pocos segundos es mejor . Con algunos de los sistemas que usamos en el trabajo, almacenamos en caché cientos de líneas antes de insertarlas todas de una vez.

Desde el MySQL documentation que puede hacer una multilínea insertar este modo:

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

mi experiencia es que al insertar datos en una base de datos MySQL es más rápido para trabajar con lotes.

Así que la opción lento está ejecutando varias consultas de inserción:

 

    INSERT INTO my_table VALUES (1, "a"); 
    INSERT INTO my_table VALUES (2, "b"); 

La opción más rápido sería:

 

    INSERT INTO my_table VALUES (1, "a"), (2, "b"); 

Cuestiones relacionadas