2012-06-07 9 views
9

Mam bardzo duży stół z kluczem podstawowym z BINARY(20).Uzyskiwanie liczby wierszy wstawionych dla WŁĄCZENIA DUPLIKOWANEJ WIELKIEJ AKTUALNEJ Wstawki?

Tabela ma około 17 milionów wierszy. Co godzinę zadanie cron próbuje wstawić do tej tabeli aż 50 000 nowych wpisów ze składnią ON_DUPLICATE_KEY_UPDATE.

Każda wkładka w cronjob ma 1000 wartości (wkładka wielokrotna). Jak mogę uzyskać liczbę wierszy wstawionych do tabeli z tego zapytania? Nie mogę zrobić liczby wierszy przed i po, ponieważ istnieje około 17 milionów wierszy, a zapytanie jest zbyt drogie.

w podręczniku mysql mówi na wiersz wstawiony numer dotknięte wierszy jest 1 i zaktualizowaną dziedzinie jest to 2, czyli w moim 1000 INSERT ON duplikat KEY zapytania UPDATE mógłbym wierszy począwszy od 1000 - 2000, ale nie mam możliwości powiedzieć, ile wpisów zostało wstawionych z tego numeru?

Jak mogę to przezwyciężyć?

Dzięki

Odpowiedz

11

Liczbę wkładek byłoby 2000 minus liczba wierszy. Bardziej ogólnie:

(numberOfValuesInInsert * 2) - mysql_affected_rows() 

EDIT:

Jak tomas points out The MySQL docs rzeczywiście powiedzieć:

Z ON duplikat KEY UPDATE wartość dotkniętą wierszy na wiersz jest 1, jeśli wiersz jest wstawiany jako nowy wiersz, 2 jeśli istniejący wiersz jest aktualizowany, i 0, jeśli istniejący wiersz jest ustawiony na jego bieżące wartości.

[podkr]

konsekwencji, jeśli ustawienie istniejący wiersz do tych samych wartości, jest możliwość, że to niemożliwe, aby powiedzieć, ile wierszy zostały zaktualizowane vs. włożona, ponieważ dwie wstawki byłyby nie do odróżnienia od siebie aktualizuj z różnymi wartościami + jedną aktualizację o tych samych wartościach.

+0

Moja matematyka nie jest najlepsza, nie mogę objąć głowy tym lolem, zrobię kilka testów, dziękuję kolego. – Griff

+0

Rzeczywiście masz rację, dzięki koleś uratował mój dzień :) – Griff

+0

Ten asnwer zakłada, że ​​otrzymamy 1 lub 2 dla każdego rzędu. Z dokumentacji MySQL: Dla instrukcji INSERT ... ON DUPLICATE KEY UPDATE, wartość poszczególnych rzędów dla danego wiersza wynosi 1, jeśli wiersz jest wstawiany jako nowy wiersz, 2 jeśli istniejący wiersz jest aktualizowany, a 0, jeśli istniejący wiersz jest ustawiony na jego bieżące wartości Więc myślę, że jeśli istniejący wiersz pozostanie niezmieniony, otrzymamy 0, a to nie zadziała ..:/ – tomas

6

Kiedy Twoje zadanie ma wkład 1000, niektóre są czystymi wstawkami, a niektóre są Aktualizacjami, ponieważ masz ON_DUPLICATE_KEY_UPDATE. ten sposób można dostać pierwszego równania

(1) Wkładki + Aktualizacje = Nie wstawionych wierszy (w tym przypadku 1000)

Biorę prosty przykład, gdy pojawi się wartość 1350 dla my_sql_affected_rows. od do Wstaw wartość 1 i zaktualizuj wartość 2 agregatów do my_sql_affected_rows. Otrzymuję następujące równanie.

(2) Wkładki + 2 * Aktualizacje = my_sql_affected_rows (w tym przypadku 1350).

Odejmij (2) - (1). Otrzymasz

(3) Aktualizacje = my_sql_affected_rows - Nie wierszy wstawionych

Aktualizacje = 1350/00 (w tym przykładzie).

Aktualizacje = 350.

wartość Zastępca Aktualizacje w równaniu (1), można uzyskać

Wstawki = 650

Zatem, aby uzyskać liczbę aktualizacji, trzeba tylko użyć równania (3) bezpośrednio.

+0

Założono więc, że istnieją zarówno wstawki, jak i aktualizacje, co nie zawsze ma miejsce. Może to być jeden z pozostałych przypadków: tylko wstawki, tylko aktualizacje, brak wstawek lub aktualizacji. Czy w takich przypadkach można ustalić liczbę czystych wkładek? – satoru

+0

Równanie (1) nie jest tu poprawne, ponieważ jeśli wiersz jest ustawiony na jego bieżące wartości, otrzymujemy 0., więc otrzymasz: (1) Wstawki + Aktualizacje + Bez zmian = Wstawiono wiersze. który daje 3 zmienne i sprawia, że ​​jest to nierozwiązywalne: / – tomas

Powiązane problemy