2009-09-12 16 views
5

Estoy recorriendo una serie de valores (1 a 100, por ejemplo) y ejecutando una instrucción preparada dentro del ciclo.Rendimiento en PDO/PHP/MySQL: transacción versus ejecución directa

¿Existe la ventaja de utilizar una transacción (confirmar después de la finalización del bucle) en comparación con una ejecución directa dentro del bucle?

Los valores no dependen el uno del otro, por lo que no es necesaria una transacción desde ese punto de vista.

Respuesta

4

Si sus consultas están insertos, la página 7.2.19. Speed of INSERT Statements del manual de MySQL proporciona dos informaciones interesantes, dependiendo de si su están utilizando un motor de transactionnal o no:

Cuando se utiliza un motor no transactionnal:

Para acelerar las operaciones de INSERT que son realizadas con varias instrucciones para tablas no transaccionales, bloquee sus tablas .

Esto beneficia el rendimiento porque el búfer de índice es vuelca en disco única una vez, después de que todas las instrucciones INSERT tienen completado. Normalmente, habría como muchas descargas de búfer de índice ya que hay sentencias INSERT. Las instrucciones explícitas de bloqueo no son necesarias si puede insertar todas las filas con un solo INSERT.

Y, con un motor transactionnal:

Para obtener inserciones más rápidas para tablas transaccionales, se debe utilizar START TRANSACTION y COMMIT lugar de LOCK TABLES.

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

Hay más información sobre la página que está conectado, por lo que no dudan en leerlo ;-)


Y, si usted está haciendo update statements:

Otra forma de obtener actualizaciones rápidas es actualizar las demoras y luego hacer muchas actualizaciones en una fila más adelante. La ejecución de múltiples actualizaciones juntas es mucho más rápida que haciendo una a la vez si bloquea la tabla .

Así que, supongo que se puede decir lo mismo que con insertos.


Por cierto: para estar seguro, se puede tratar ambas soluciones, la evaluación comparativa con microtime, en el lado de PHP, por ejemplo ;-)

+0

Muchas gracias por la información, supongo que tendré que probar y comparar. – jeroen

+2

Supongo que sí ^^ Déjenos saber sobre los resultados ;-) ¡Podría interesar a otras personas! Y, por cierto, otra solución sería usar una consulta de inserción para hacer varias inserciones al mismo tiempo, reduciendo el número total de consultas, un poco más difícil de codificar, pero he visto grandes mejoras con eso, ya que significa menos llamadas de un servidor a otro. –

+0

Sí, reducir el número de consultas sería la mejor solución, pero como mencioné a James Black también, nunca lo he intentado con INSERT ON DUPLICATE KEY UPDATE, ni siquiera sé si es posible. – jeroen

3

Durante un tiempo más rápido que podría hacer todas las inserciones de una sola vez , o agrúpelos juntos, tal vez 5 o 10 a la vez, como si un inserto fallara, todo el lote lo hará.

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

Una transacción le hará perder tiempo, por lo que si no es necesario, entonces no lo uso.

Una declaración preparada sería una buena opción, aunque incluso haya hecho inserciones por lotes, ya que no tiene que seguir desarrollando la consulta cada vez.

+0

Estaba pensando en combinarlos, pero nunca lo he intentado con INSERT ON DUPLICATE KEY UPDATE. – jeroen

3

Me enfrenté a la misma pregunta cuando tuve que implementar un archivo CSV (posiblemente bastante largo) importación de datos (sé que puede usar la sintaxis LOAD DATA INFILE 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 única transacción, solo lleva unos segundos y está unida a la CPU. Si no uso ninguna transacción, lleva varios minutos y está limitado por IO. Al comprometer cada N filas, obtuve resultados intermedios.

+0

sería aún más rápido con LOAD DATA INFILE;) – NickT

Cuestiones relacionadas