2010-06-28 14 views
7

Mam więc bazę danych, w której jest wiele danych wstawianych z aplikacji java. Zwykle wstawiam do table1 otrzymam ostatni id, a następnie wstawiam do table2 i otrzymam ostatni identyfikator stamtąd, a następnie wstawiam do table3 i otrzymam również ten identyfikator i pracuję z nim w aplikacji. I wstawiam około 1000-2000 wierszy danych co 10-15 minut.Wprowadzanie dużej ilości danych do bazy danych przy użyciu bardzo małych wstawek

Używanie wielu małych wkładek i zaznaczeń na serwerze produkcyjnym nie jest zbyt dobre, ponieważ czasami maskuje serwer.

Moje pytanie brzmi: czy istnieje sposób wstawiania wielu danych do table1, table2, table3 bez użycia tak dużej ilości selekcji i wstawek? Czy brakuje mi techniki sql-fu?

Odpowiedz

5

Ponieważ prawdopodobnie polegasz na kluczach podstawowych auto_increment, musisz wstawiać po jednym na raz, przynajmniej dla table1 i table2. Ponieważ MySQL nie da ci więcej niż ostatni wygenerowany klucz.

Nigdy nie powinieneś wybierać. Możesz pobrać ostatni wstawiony identyfikator z Oświadczenia, używając metody getGeneratedKeys(). Patrz przykład pokazujący to w instrukcji dla MySQL Connector/J:

http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-basic.html#connector-j-examples-autoincrement-getgeneratedkeys

Inne zalecenia:

  • Zastosowanie wielorzędowe INSERT składnia table3.
  • Podczas importowania używaj kodu ALTER TABLE DISABLE KEYS i włączaj je ponownie, gdy skończysz.
  • Użyj transakcji jawnych. To znaczy. rozpoczynanie transakcji przed procedurą ładowania danych i zatwierdzanie na końcu. Prawdopodobnie również popełnię błąd po każdych 1000 rzędach tabeli1.
  • Użyj przygotowanych wyciągów.

Niestety, nie można skorzystać z najszybszą metodę luzem obciążenia danych, LOAD DATA INFILE, ponieważ nie pozwalają na uzyskanie wygenerowane wartości id za rzędzie.

2

Istnieje wiele mówić o tutaj:

  1. Jest wielce prawdopodobne, że opóźnienia w sieci zabija, czy każdy z tych wkładek jest inny obie sieci. Spróbuj grupować swoje żądania, aby wymagały tylko jednego obiegu dla całej transakcji.
  2. Mówiąc o transakcjach, nie wymieniasz ich. Jeśli wszystkie trzy z tych INSERTów muszą być pojedynczą jednostką pracy, lepiej będzie poprawnie obsługiwać transakcje. Jeśli nie wiesz jak, lepiej je zbadaj.
  3. Spróbuj buforować żądania, jeśli są często ponownie używane. Najszybszy objazd to ten, którego nie robisz.
1

Można przeprojektować bazę danych tak, aby klucz podstawowy nie był generowaną przez bazę danych, automatycznie zwiększaną wartością, ale raczej wygenerowanym przez klienta identyfikatorem UUID. Następnie możesz wygenerować wszystkie klucze do każdego rekordu z góry i wsypać wstawki, jak chcesz.

+0

Dobry pomysł, ale jest ... ale czas na przeprojektowanie bazy danych byłby zbyt czasochłonny. Istnieje przeprojektowana baza danych, ale nie teraz. – Gabriel

Powiązane problemy