Pregunta

Estoy recorriendo varios valores (del 1 al 100, por ejemplo) y ejecuto una declaración preparada dentro del ciclo.

¿Existe alguna ventaja al usar una transacción (comprometerse después de que finaliza el ciclo) en comparación con una ejecución directa dentro del ciclo?

Los valores no dependen entre sí, por lo que no se necesita una transacción desde ese punto de vista.

¿Fue útil?

Solución

Si sus consultas son INSERT, la página 7.2.19 . Velocidad de las instrucciones INSERT del manual de MySQL proporciona dos informaciones interesantes, dependiendo de si está utilizando un motor transaccional o no:

Cuando se utiliza un motor no transaccional:

  

Para acelerar las operaciones INSERT que son   realizado con múltiples declaraciones para   tablas no transaccionales, bloquee su   tablas.

     

Esto beneficia el rendimiento porque el   el búfer de índice se vacía solo en el disco   una vez, después de que todas las declaraciones INSERT   terminado. Normalmente, habría como   muchos lavados del búfer de índice como hay   INSERTAR declaraciones. Bloqueo explícito   las declaraciones no son necesarias si puedes   inserte todas las filas con un solo INSERTAR.

Y, con un motor transaccional:

  

Para obtener inserciones más rápidas para   tablas transaccionales, deberías usar   INICIAR TRANSACCIÓN y COMPROMETERSE   de TABLAS DE BLOQUEO.

Entonces supongo que usar transacciones podría ser una buena idea, pero supongo que eso podría depender de la carga en su servidor, y si hay múltiples usos usando la misma tabla en el mismo momento, y todo eso ...

Hay más información en la página a la que me vinculé, así que no dude en leerla ;-)


Y, si está haciendo declaraciones de actualización :

  

Otra forma de obtener actualizaciones rápidas es   retrasar las actualizaciones y luego hacer muchas actualizaciones   en una fila más tarde. Realizar múltiples   las actualizaciones juntas son mucho más rápidas que   haciendo uno a la vez si bloquea el   mesa.

Entonces, supongo que se puede decir lo mismo que para las inserciones.


Por cierto: para estar seguro, puede probar ambas soluciones, comparándolas con microtime , en el lado de PHP, por ejemplo ;-)

Otros consejos

Para un tiempo más rápido, puede hacer todas las inserciones de una sola vez, o agruparlas, quizás 5 o 10 a la vez, como si una inserción fallara, todo el lote lo hará.

http://www.desilva.biz/mysql/insert.html

Una transacción lo ralentizará, así que si no lo necesita, no lo use.

Sin embargo, una declaración preparada sería una buena opción, incluso si hiciera inserciones por lotes, ya que no tiene que seguir acumulando la consulta cada vez.

Me enfrenté a la misma pregunta cuando tuve que implementar un archivo CSV (posiblemente bastante largo) para importar datos (sé que puede usar SINTOMA DE CARGA DE ARCHIVO DE DATOS para eso, pero tuve que aplicar algo de procesamiento en mis campos antes de la inserción).

Así que hice un experimento con transacciones y un archivo con aproximadamente 15k filas. El resultado es que si inserto todos los registros dentro de una transacción única, solo toma unos segundos y está vinculada a la CPU. Si no uso ninguna transacción en absoluto, lleva varios minutos y está limitada por IO. Al comprometer cada N filas, obtuve resultados intermedios.

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