2009-01-21 38 views
8

Część systemu, nad którym obecnie pracuję, wymaga zalogowania się w mysql, z licznymi aktualizacjami.Funkcja MySQL do wstawiania rekordów, jeśli aktualizacja się nie powiedzie?

włożeniu danych jest w formacie:

date | name | count | 
-----------+------+-------+ 
2009-01-12 | alan | 5 | 
2009-01-12 | dave | 2 | 
2009-01-12 | mary | 1 | 

Dane te są regularnie analizowane z płaskiego pliku, podsumowana jak powyżej, w ramach przygotowań do wkładki dB/aktualizacji - unikalny klucz w bazie danych jest (date, name) para.

Poprzednio ten system sprawdzałby istniejącą tabelę dla dowolnych rekordów dla danej pary date i name przed podjęciem decyzji o aktualizacji lub wstawieniu.

Problemem, który mamy, jest to, że wraz ze wzrostem tej tabeli czas reakcji nie poprawia się, a my chcemy maksymalnie ograniczyć liczbę zapytań.

System został niedawno zaktualizowany do uruchomienia INSERT ... ON DUPLICATE KEY UPDATE zapytania, który ma zmniejszoną liczbę select s nieznacznie, ale nasza wspólna sprawa pewnej odległości jest update.

Zastanawiam się, czy ktoś wie o funkcji mysql, która jest zasadniczo INSERT ... ON DUPLICATE KEY UPDATE w odwrotnej kolejności, to znaczy będzie próbować zaktualizować wiersz, jeśli żaden nie pasuje, a następnie wykonać wkładkę?


Edit

nie sprawiają, że zbyt jasne powyżej, co chciałbym zrobić, gdy mam rekord ('2009-01-12','alan','5') jest na przykład:

UPDATE table SET count = count+5 WHERE date = '2009-01-12' and name = 'alan'; 

a jeśli powyżej nie powiedzie się, wstaw powyższe dane. Konieczność zwiększenia licznika powoduje, że REPLACE nie będzie działać. Wymienić wykonuje usuwania & wkładkę i nie pozwalają zapoznać się z rzędu przed usunięciem więc count = count + 5 nie zwiększamy wartość poprzednią count przez 5.

@jasoncohen - The INSERT ... ON DUPLICATE KEY UPDATE ma wykonać zadanie, ale jestem pytam, czy jest na to bardziej optymalny sposób.

Przepraszamy za wszelkie zamieszanie wynikające ze złego oryginalnego frazowania!

Odpowiedz

3

To tak samo. W przypadku "UPDATE ... ON NO KEY INSERT" silnik bazy danych będzie musiał najpierw sprawdzić, czy jest coś do aktualizacji. Dlatego nie ma potrzeby stosowania osobnej konstrukcji, nawet jeśli aktualizacja jest najczęstsza.

+0

Ma sens, pytał więcej w nadziei niż oczekiwanie, że jest jakaś magiczna, super-wydajna kwerenda mysql do tego! – ConroyP

+0

Przykład użycia byłby miły. –

+0

@HelgaIliashenko z prośbą, aby najpierw zapytać o przykład użycia, zanim pójdzie w dół, byłoby miło –

0

Dlaczego nie wystarcza INSERT? Nawet jeśli przez większość czasu jest to duplikat klucza, a zatem aktualizacja (zamiast na odwrót), to nadal jest właściwa operacja, prawda?

Po prostu pytasz o problemy z wydajnością?

1

Próbowałem dowiedzieć się, co to jest, czego chcesz, a jak widzę, nie chcesz robić niczego, jeśli dane pasują do siebie ?Nie widzę rozwiązania tego problemu, jeśli "liczyć" jakoś się zmieni i trzeba będzie je zaktualizować, utknąłeś z INSERT INTO ON DUPLICATE KEY UPDATE (którego tak naprawdę nie widzę problemu z).

Jeśli jednak liczba nie zostanie zaktualizowana, możesz zajrzeć do INSERT IGNORE INTO, która zignoruje insert, jeśli unikalny klucz (date + name) już istnieje.

Nie rozważałeś "płukania/obracania" swojego płaskiego pliku tylko w celu sprawdzenia, czy nie ma dodanych materiałów? Czy nie jest to możliwe?

Edit:

INSERT nie powiedzie się natychmiast z powodu naruszenia zdublowany klucz i wywołać aktualizację w tej sprawie. W ogóle nie powinno to być problemem wydajności. Robię to cały czas na dość dużej bazie danych i nie zauważyłem żadnej dużej różnicy w wydajności przy rozpoczynaniu od pustej bazy danych w przeciwieństwie do już zapełnionej bazy danych.

Jednak pewnie dobrze jest uruchomić ANALIZA TABELI/TABELA OPTYMALIZACJI od czasu do czasu, aby utrzymać indeks w dobrej formie.

Powiązane problemy