2012-06-12 8 views
5

Muszę pisać do bazy danych MySQL wiele danych około 5 razy na sekundę. Jaki jest najszybszy sposób: wstaw co 1/5 sekundy lub utwórz kolejkę i wstaw wszystkie przechowywane dane co ~ 5 sekund? Jeśli drugi sposób jest lepszy - czy można wstawić do 1 tabeli, używając 1 żądania w kilku wierszach?Wstawianie do bazy danych

Odpowiedz

2

Biorąc pod uwagę częstotliwość wstawkami Jego lepszą do idź z drugim podejściem, które jest w kolejce i dodając za jednym zamachem.!

ale należy wziąć pod uwagę następujące scenariusze pierwszy:

  1. Czy Twój system Real Time.? Tak, a więc jakie jest maksymalne opóźnienie, na które możesz sobie pozwolić (ponieważ zajmie to około 5 sekund na następne wstawienie, a dane zostaną utrwalone/dostępne)?

  2. Jakie są szanse na niepoprawne wartości/błędy pojawiające się w danych, tak jakby jeden z danych był nieprawidłowy, stracisz resztę, jeśli zapytanie nie powiedzie się.

+0

Tak, system działa w czasie rzeczywistym. Dane są prostym base64 z ~ 100 bajtami danych. – Ockonal

+2

Jeśli tak, chciałbym iść z pojedynczym wstawieniem i łączeniem połączeń w warstwie DAO. Ponieważ nie można pozwolić sobie na utratę danych w RTS, czas jest również krytyczny.! Mam nadzieję, że to ci pomogło. :) –

+0

Dzięki za pomoc;) – Ockonal

2

Korzystanie z wielu pul buforów z innodb_buffer_pool_instances. może zależeć od liczby rdzeni onmachine. Użyj Partitioning tabeli.
Można zbiorczo wstawiać dane za pomocą XML.

1

Można zrobić wkładkę ze wszystkimi danymi witho coś takiego:

INSERT INTO table (field1, field2,... , fieldN) 
VALUES 
(value1_1', value1_2,... , value1_N), 
(value2_1', value2_2,... , value2_N), 
... 
(valueM_1', valueM_2,... , valueM_N); 
2

Ponieważ każda transakcja pochodzi z kosztów stałych, powiedziałbym, że robi multi-line wstawić co kilka sekund jest lepiej . W przypadku niektórych systemów, z których korzystamy w pracy, buforujemy setki wierszy przed ich wstawieniem za jednym razem.

Od MySQL documentation można zrobić multi-line wstawić tak:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 
1

Moje doświadczenie jest to, że podczas wstawiania danych do bazy danych MySQL jest szybszy współpracować z partiami.

Więc opcja wolniej jest wykonywanie wielu zapytań insert:

 

    INSERT INTO my_table VALUES (1, "a"); 
    INSERT INTO my_table VALUES (2, "b"); 

szybsza opcja byłoby:

 

    INSERT INTO my_table VALUES (1, "a"), (2, "b");