MySQL “insertos” diferencia de velocidad entre la producción y el medio ambiente local es demasiado grande!

StackOverflow https://stackoverflow.com/questions/1078302

Pregunta

He instalado MySQL 5.1x ejemplo en una máquina Linux (768 MB de RAM). He restaurado una copia de seguridad de alrededor de 1.000 filas ya través de mi aplicación .NET (desplegado en un servidor web diferente de Windows) He realizado algunas operaciones de lectura, que, si se considera que la mesa tenía ningún índice, fueron rápidos.

I y se aclaró el servidor desde estas filas y se utiliza una característica en mi aplicación web en el otro servidor para insertar filas (Básicamente, leí el texto de un archivo de texto, introducir los datos en los campos de una clase personalizada, y luego llamar un procedimiento almacenado con estos parámetros para cada registro). Cuando tuve el sitio web y la base de datos tanto en mi máquina local, me gustaría insertar filas al instante 2500 (menos de un segundo). Ahora, sin embargo, en el entorno de la "producción", estos mismos 2500 filas están tomando 10 minutos a insertar. Estoy utilizando el my.cnf defecto que viene con la instalación de MySQL.

¿Hay alguna manera de poder optimizar las escrituras sin comprometer la velocidad de las operaciones de lectura? O me estoy perdiendo algo obvio?

Gracias de antemano!

¿Fue útil?

Solución

¿Has mirado en la página del manual de MySQL para la velocidad de inserción ? La primera suposición de que viene a la mente para mí es que no se está envolviendo el conjunto de 2500 procedimientos en un iniciar la transacción / Commit declaración, por lo que MySQL está autocommitting cada una de las acciones 2500.

Otros consejos

Además del problema mencionado por Mark (auto-commit en lugar de transacción), Sin duda lo investigo el uso de actualizaciones por lotes. Debido a una diferencia importante entre una conexión local y una conexión de red (aunque sea muy rápido) es el tiempo de ida y vuelta.

Mientras que el ancho de banda es muy probable que no el factor limitante en este caso, haciendo 2500 ida y vuelta de red a la base de datos y volver definitivamente tomará mucho más tiempo en una red que en la máquina local.

El uso de una actualización por lotes puede reducir los insertos a una sola ida y vuelta lo ideal y sólo unos pocos en la práctica.

Por desgracia, no puedo decirle cómo hacer esas actualizaciones por lotes en el mundo .NET, en Java que tendría que utilizar PreparedStatement.addBatch() . Estoy seguro de que hay algo similar en .NET.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top