Mamy tabelę (obecnie InnoDB), która zawiera około 500 000 wierszy. Jest to kolejka zadań do uruchomienia. Jest przechowywany w bazie danych MySQL.Zakleszczenia w MySQL usuwające wiersze
W sposób ciągły, co najmniej raz na sekundę, ale czasami częściej wybieramy z niej dane, a następnie aktualizujemy niektóre wiersze. Raz dziennie wycinamy stare rzędy ze stołu.
Zaczęliśmy dostawać zakleszczenia na stół, co spowodowało wstrzymanie naszego przetwarzania zadań. Te zakleszczenia powstały podczas nocnego prune. Połączenie DELETE, SELECT i UPDATE oznaczało, że w zasadzie nic nie może się wydarzyć. Niestety nie mam danych wyjściowych SHOW ENGINE INNODB STATUS.
Chciałbym poznać najlepszą opcję radzenia sobie z tym. Pamiętaj, że nasz kod wykrywa zakleszczenia i ponownie wysyła zapytanie. Poza tym, dawno temu odkryliśmy, że usuwanie wszystkich pasujących wierszy naraz było zbyt dużym obciążeniem dla tabeli bazy danych, która odnotowała dużą aktywność, więc LIMIT usuniemy nasze usunięcia do 10 000 wierszy naraz i kontynuujemy ponowne wysyłanie zapytania do momentu, aż wszystkie niezbędne wiersze zostaną usunięte. przycięte.
widzę następujące opcje i chciałby opinie na którym są najlepsze, czy sugestie dotyczące innych opcji:
- DELETE mniej wierszy naraz
- Zastosowanie wykładniczy ograniczania mocy na naszych usuwa, choć obawiam się, że to nie pomoże, biorąc pod uwagę nasz specyficzny nakład pracy
- TABLICE ZABLOKOWANIA zgodnie z MySQL documentation. Prawdopodobnie moglibyśmy zaakceptować blokowanie instrukcji SELECT i UPDATE na czas usuwania.
- Przełącz na typ tabeli MyISAM. Udaliśmy się z InnoDB, ponieważ początkowo używaliśmy transakcji na tej tabeli. Tak już nie jest. Nie jestem wystarczająco zaznajomiony ze specyfiką, aby wiedzieć, czy jest to opłacalne rozwiązanie.
- Być może użyj UPDATE LOW_PRIORITY. Może być tak, że DELETE nie wpływają na SELECT, tylko UPDATE, i to może być wystarczające.
Wszystkie napotkane przeze mnie zakleszczenia zostały spowodowane niezakończonymi transakcjami. Upewnij się, że prawidłowo przeprowadzasz transakcje (z włączonym autouzależnianiem lub autocommitem i faktycznie obsługują zatwierdzanie/wycofywanie). – localshred
Zdecydowanie dobry punkt; tak bywało przez większość czasu, ale tak naprawdę nie robimy transakcji na tym stole. Kiedyś, ale już nie. – ChrisInEdmonton