2012-06-07 17 views
9

Ho una tabella molto grande con una chiave primaria di BINARY(20).Ottenere il numero di righe inserite per ON DUPLICATE KEY UPDATE multiple insert?

Il tavolo ha circa 17 milioni di righe. Ogni ora un cron job tenta di inserire fino a 50.000 nuove voci in questa tabella con la sintassi ON_DUPLICATE_KEY_UPDATE.

Ogni inserto nel cronjob è con 1000 valori (inserto multiplo). Come posso ottenere il numero di righe inserite nella tabella da questa query? Non riesco a fare il conteggio delle righe prima e dopo dato che ci sono circa 17 milioni di righe e la query è troppo costosa.

Nel mysql manuale dice per una riga inserita il numero interessata di righe è 1 e per un campo aggiornato è 2, che significa a mio 1000 INSERT ON DUPLICATE interrogazione UPDATE KEY ho potuto avere righe interessate vanno 1.000-2.000, ma non ho modo di dire quanti record sono stati inseriti da questo numero?

Come posso superare questo?

Grazie

risposta

11

Il numero di inserti sarebbero 2.000 meno il numero di righe interessate. Più in generale:

(numberOfValuesInInsert * 2) - mysql_affected_rows() 

EDIT:

Come tomas points out, La MySQL docs effettivamente dire:

Con ON DUPLICATE KEY UPDATE, il valore-righe coinvolte per fila è 1 se la riga viene inserito come una nuova riga, 2 se viene aggiornata una riga esistente, e 0 se una riga esistente è impostata sui valori correnti.

[sottolineatura mia]

conseguenza, se modificando una riga esistente agli stessi valori è una possibilità, è impossibile sapere quante righe sono state aggiornate vs inserito, poiché due inserti sarebbero indistinguibili da una aggiorna con valori diversi + un aggiornamento con gli stessi valori.

+0

La mia matematica non è la migliore, non riesco a farmi girare la testa per questo lol, farò qualche test, grazie amico. – Griff

+0

In effetti hai ragione, amico, ho salvato la mia giornata :) – Griff

+0

Questo presuppone che otterremo 1 o 2 per ogni riga. Dai documenti MySQL: Per le istruzioni INSERT ... ON DUPLICATE KEY UPDATE, il valore delle righe interessate per riga è 1 se la riga viene inserita come una nuova riga, 2 se una riga esistente viene aggiornata e 0 se un riga esistente è impostata sui suoi valori correnti Quindi penso che se una riga esistente viene lasciata invariata, otterremo 0 e questo non funzionerà ..:/ – tomas

6

Quando il tuo lavoro fa un inserto di 1000, alcuni sono puri inserti e alcuni sono aggiornamenti in quanto hai ON_DUPLICATE_KEY_UPDATE. Così si ottiene la prima equazione

(1) Inserti + Aggiornamenti = No di righe inserite (in questo caso 1000)

prendo un semplice esempio in cui si ottiene un valore di 1350 per i my_sql_affected_rows. poiché per un Inserisci un valore di 1 e per aggiornare un valore di 2 aggregati a my_sql_affected_rows. Prendo la seguente equazione.

(2) Inserti + 2 * Aggiornamenti = my_sql_affected_rows (in questo caso 1350).

Sottrai (2) - (1). Si ottiene

(3) = Aggiornamenti my_sql_affected_rows - No di righe inserite

Aggiornamenti = 1350-1000 (in questo esempio).

Aggiornamenti = 350.

valore sostitutivo degli aggiornamenti nell'equazione (1), si ottiene

Inserti = 650

Così per ottenere il numero di aggiornamenti, è sufficiente utilizzare l'equazione (3) direttamente.

+0

Quindi questo presuppone che ci siano sia inserti che aggiornamenti, il che non è sempre il caso. Può essere uno degli altri casi: solo inserimenti, solo aggiornamenti, nessun inserimento o aggiornamento. È possibile scoprire il numero di inserti puri in questi casi? – satoru

+0

L'equazione (1) non è precisa qui perché se una riga è impostata sui suoi valori correnti, otteniamo 0. quindi otterresti: (1) Inserti + Aggiornamenti + Invariato = No di righe Inserito. che dà 3 variabili e rende questo irrisolvibile: / – tomas

Problemi correlati