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
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:
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)?
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ę.
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
.
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);
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);
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");
Tak, system działa w czasie rzeczywistym. Dane są prostym base64 z ~ 100 bajtami danych. – Ockonal
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. :) –
Dzięki za pomoc;) – Ockonal