Napotkaliśmy problem po przeniesieniu bazy danych naszego klienta na dodatkowy serwer. Powinno to mieć pozytywny wpływ na wydajność witryny, ale występuje problem z blokowaniem tabel w MyISAM. (Słyszałem o używaniu InnoDB zamiast MyISAM, ale nie możemy zmienić silnika w najbliższej przyszłości).
Możemy wykryć to w zapytaniu o aktualizację, które jest wykonywane, gdy moderator aktywuje komentarz na stronie artykułów. Oto proces:
- zapytanie o aktualizację jest przetwarzane
SET status = 1 WHERE id = 5
(indeks jest ustawiony) - buforowane pliki strony są usuwane
W tym momencie cała strona staje się wolna. Sama baza danych jest zajęta przez kilka minut. Pobierałem listę procesów kilka razy i zobaczyłem około 60 wpisów z różnych zapytań select, które były w stanie oczekiwania na blokadę poziomu tabeli .
1. Nie rozumiem, dlaczego ta aktualizacja w tabeli article_comments
może wpływać na instrukcje select, aby tabela article
czekała na blokadę na poziomie tabeli. Na liście procesów prawie wszystkie oczekujące zapytania pochodziły z tej tabeli. Czytałem o tym, że aktualizacje / wstawki są lepsze niż selekcje i że może to powodować takie problemy, ale sama tabela artykułów nie jest aktualizowana po aktywowaniu komentarzy, więc selekcje nie powinny czekać. Czy źle to zrozumiałem?
2. Czy jest coś oprócz zmiany na InnoDB, aby zapobiec temu zachowaniu lub przynajmniej uzyskać lepszą równowagę? Jestem bardzo zirytowany faktem, że ten problem nie pojawił się przed przeniesieniem bazy danych na nowy serwer. Wydaje mi się, że jest trochę błędna konfiguracja, ale nie wiem, jak to zidentyfikować.
key_buffer_size
był ustawiony na 1GB
. Zwiększenie tego, aby 10GB
zmniejszyć problem.