2012-06-07 14 views
9

Tengo una mesa muy grande con una clave principal de BINARY(20).Obtener el número de filas insertadas en ON DUPLICATE KEY UPDATE inserción múltiple?

La tabla tiene alrededor de 17 millones de filas. Cada hora, un trabajo cron intenta insertar hasta 50,000 nuevas entradas en esta tabla con la sintaxis ON_DUPLICATE_KEY_UPDATE.

Cada inserción en el cronjob tiene 1.000 valores (inserción múltiple). ¿Cómo puedo obtener el número de filas insertadas en la tabla desde esta consulta? No puedo hacer un recuento de filas antes y después ya que hay alrededor de 17 millones de filas y la consulta es demasiado costosa.

En el mysql manual dice que para una fila inserta el número afectado de filas es 1 y para un campo actualizado es 2, es decir, en mi 1000 INSERTAR EN DUPLICADO consulta UPDATE CLAVE pudiera tener filas afectadas van desde 1000 - 2000 pero no tengo manera de saber cuántos registros se insertaron desde este número?

¿Cómo puedo superar esto?

Gracias

Respuesta

11

El número de inserciones de 2000 serían menos el número de filas afectadas. De manera más general:

(numberOfValuesInInsert * 2) - mysql_affected_rows() 

EDIT:

Como tomas points out, La MySQL docs realidad dicen:

Con EN DUPLICADO KEY UPDATE, el valor de registros afectados por fila es 1 si la fila se inserta como una nueva fila, 2 si se actualiza una fila existente, y 0 si una fila existente se establece en sus valores actuales.

[el énfasis es mío]

En consecuencia, si el establecimiento de una fila existente en los mismos valores es una posibilidad, es imposible saber cuántas filas se actualiza vs inserta, ya que dos insertos serían indistinguibles de uno actualizar con diferentes valores + una actualización con los mismos valores.

+0

Mi matemática no es la mejor, no puedo entender esto, voy a hacer algunas pruebas, gracias amigo. – Griff

+0

De hecho, estás en lo correcto gracias amigo me salvó el día :) – Griff

+0

Este asnwer asume que obtendremos 1 o 2 por cada fila. De los documentos de MySQL: Para INSERTAR ... EN instrucciones DUPLICATE KEY UPDATE, el valor de filas afectadas por fila es 1 si la fila se inserta como una nueva fila, 2 si se actualiza una fila existente y 0 si fila existente se establece en sus valores actuales Así que creo que si una fila existente se deja sin cambios, obtendremos 0 y esto no funcionará ...:/ – tomas

6

Cuando su trabajo tiene una inserción de 1000, algunos son insertos puros y algunos son actualizaciones ya que tiene el ON_DUPLICATE_KEY_UPDATE. De este modo se consigue la primera ecuación

(1) Inserta + Actualizaciones = n de filas insertadas (en este caso 1000)

que tomar un ejemplo sencillo en el que se obtiene un valor de 1,350 para los my_sql_affected_rows. ya que para Insertar un valor de 1 y para actualizar un valor de 2 agregados a my_sql_affected_rows. Obtengo la siguiente ecuación.

(2) Inserciones + 2 * Actualizaciones = my_sql_affected_rows (en este caso 1350).

Resta (2) - (1). Se obtiene

(3) Actualizaciones = my_sql_affected_rows - n de filas insertadas

Actualizaciones = 1350-1000 (en este ejemplo).

Actualizaciones = 350.

valor de sustitución de actualizaciones en la ecuación (1), se obtiene

Inserts = 650

Por lo tanto para obtener el número de actualizaciones, sólo se necesita utilizar la ecuación (3) directamente.

+0

Así que esto supone que hay inserciones y actualizaciones, lo que no siempre es el caso. Puede ser uno de los otros casos: solo inserciones, solo actualizaciones, sin inserciones o actualizaciones. ¿Es posible averiguar la cantidad de insertos puros en estos casos? – satoru

+0

La ecuación (1) no es precisa aquí porque si una fila se establece en sus valores actuales, obtenemos 0. por lo que obtendría: (1) Inserciones + Actualizaciones + Sin cambios = No de filas insertadas. que da 3 variables y hace esto insoluble: / – tomas

Cuestiones relacionadas