2010-06-28 13 views
7

Tengo una base de datos donde se insertan muchos datos desde una aplicación java. Normalmente, inserto en la tabla 1 obtengo la última identificación, luego, la inserto en la tabla 2 y obtengo la última identificación desde allí y, finalmente, la inserto en la tabla 3 y también la obtengo y la utilizo dentro de la aplicación. E inserto alrededor de 1000-2000 filas de datos cada 10-15 minutos.Inserte una gran cantidad de datos en la base de datos en inserciones muy pequeñas

Y el uso de muchas inserciones pequeñas y selecciones en un servidor web de producción no es realmente bueno, porque a veces se atasca en el servidor.

Mi pregunta es: ¿hay alguna manera de cómo insertar datos múltiples en table1, table2, table3 sin usar una gran cantidad de selecciones e inserciones? ¿Hay una técnica de sql-fu que me falta?

Respuesta

5

Dado que probablemente dependa de las claves primarias auto_increment, debe hacer las inserciones de a una por vez, al menos para table1 y table2. Porque MySQL no le dará más que la última clave generada.

Nunca debe tener que seleccionar. Puede obtener la última identificación insertada de la Declaración usando el método getGeneratedKeys(). Ver un ejemplo que muestra esto en el manual de MySQL para el Connector/J:

http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-basic.html#connector-j-examples-autoincrement-getgeneratedkeys

Otras recomendaciones:

  • uso de varias hileras INSERT sintaxis para cuadro3.
  • Use ALTER TABLE DISABLE KEYS mientras realiza la importación y vuelva a habilitarlos cuando haya terminado.
  • Usar transacciones explícitas. Es decir. comience una transacción antes de su rutina de carga de datos, y comprométase al final. Probablemente también me comprometería después de cada 1000 filas de tabla1.
  • Utilice declaraciones preparadas.

Por desgracia, no se puede utilizar el método más rápido para la carga masiva de datos, LOAD DATA INFILE, ya que no permite que usted pueda obtener los valores de ID generado por fila.

2

Hay mucho que hablar aquí:

  1. Es probable que la latencia de red a la que está matando si cada uno de los insertos se encuentra otro de ida y vuelta a la red. Intente agrupar sus solicitudes de modo que solo requieran un viaje de ida y vuelta para toda la transacción.
  2. Hablando de transacciones, no las menciona. Si los tres INSERT deben ser una sola unidad de trabajo, será mejor que maneje las transacciones correctamente. Si no sabe cómo, investigue mejor.
  3. Pruebe las solicitudes de almacenamiento en caché si se reutilizan mucho. La ida más rápida es la que no haces.
1

Puede rediseñar su base de datos de manera que la clave principal no sea un valor generado automáticamente y generado por la base de datos, sino un UUID generado por el cliente. A continuación, podría generar todas las claves para cada registro por adelantado y lotear las inserciones como desee.

+0

buena idea, pero hay un pero ... el tiempo para rediseñar la base de datos sería demasiado lento. Hay un rediseño planificado de la base de datos, pero no ahora. – Gabriel

Cuestiones relacionadas