Przyspiesz wstawki MySQL dzięki partycjom w MyISAM z unikalnym kluczem
9
Mam dużą tabelę MyISAM (~ 30 mln wierszy). W pewnym momencie przełączyłem go na stały format wierszy, więc teraz tabela zajmuje ~ 40 GB na dysku i 2 GB na indeksy. Tabela ma unikalny indeks, a na sekundę jest 100 zapytań o „wstawianie duplikatów aktualizacji klucza”. W miarę wzrostu stołu wkładki stają się coraz wolniejsze.
Nie jestem pewien, ale czy partycje pomogą mi przyspieszyć wstawianie?
Po pierwsze, jednoczesne zapisy zdecydowanie nie są opcją dla pamięci MyISAM. Każdy z nich zablokuje cały stół (z wyjątkiem niektórych przypadków czytania). Jeśli InnoDB nie pasuje do ciebie dobrze, wypróbuj TokuDB. Ale będzie wolniejszy w porównaniu do MyISAM z powodu transakcyjnej natury silnika TokuDB (i oczywiście InnoDB) (powinieneś zapisać te same dane co najmniej dwa razy: dziennik i pliki danych). Ponadto, jeśli pewnego dnia twój serwer ulegnie awarii, będziesz czekał godzinami, aż twój stół MyISAM 40 Gb naprawi się.
Jeśli nadal chcesz ładować dane do swoich tabel MyISAM i chcesz to zrobić szybko, mogę zalecić użycie LOAD DATA INFILEzamiast wstawek. Jest to najszybszy sposób ładowania dużych ilości danych do tabeli. I tak, indeksy spowolnią wydajność wstawiania w sposób wykładniczy.
Słowo o partycjach: Instrukcje INSERT w MySQL nie obsługują przycinania, więc wszystkie partycje będą skanowane pod każdą instrukcją pod kątem unikalnego dopasowania indeksu. Ponadto wszystkie partycje zostaną zablokowane do momentu zakończenia wstawiania.
Czy te zapytania wstawiania są zbieżne czy pochodzą z tego samego procesu? Jeśli są one równoczesne, lepiej użyć pamięci InnoDB dla tej tabeli, ponieważ MyISAM blokuje całą tabelę, a InnoDB wykorzystuje blokady wierszy. Jeśli przejście do innego magazynu nie jest możliwe, możesz wypróbować instrukcję INSERT DELAYED i szereg innych optymalizacji wstawiania . Partycjonowanie nie pomoże, chyba że umieścisz różne partycje na różnych dyskach fizycznych.
Te wstawki są współbieżne. Ale InnoDB działa zbyt wolno przy wstawianiu przy aktualizacji duplikatu klucza, więc nie jest to opcja. O ile mogę powiedzieć, IO nie jest wąskim gardłem - ilość pamięci RAM >> rozmiar tabel, włączając indeksy i zapisywanie jest włączona. Myślę, że problem leży gdzieś w wewnętrznych zamkach mysql czy coś takiego.
d0rc
INSERT DELAYED powinien być używany tylko w przypadku instrukcji INSERT, które określają listy wartości. Serwer ignoruje OPÓŹNIONE dla instrukcji INSERT ... SELECT lub INSERT ... ON DUPLICATE KEY UPDATE.
llazzaro,
„InnoDB jest zbyt wolny” - czy próbowałeś go trochę dostroić? Domyślne ustawienia są dość słabe.
Czy te zapytania wstawiania są zbieżne czy pochodzą z tego samego procesu? Jeśli są one równoczesne, lepiej użyć pamięci InnoDB dla tej tabeli, ponieważ MyISAM blokuje całą tabelę, a InnoDB wykorzystuje blokady wierszy. Jeśli przejście do innego magazynu nie jest możliwe, możesz wypróbować instrukcję INSERT DELAYED i szereg innych optymalizacji wstawiania . Partycjonowanie nie pomoże, chyba że umieścisz różne partycje na różnych dyskach fizycznych.
źródło