Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Bazy danych _ Któreś z kolei zapytanie jest strasznie wolne - mariadb

Napisany przez: Valantir 12.07.2020, 13:36:33

Witam wszystkich,
Ostatnio musiałem uruchomić proces, który:
a) wyszuka rekordy z tabeli (z jakimiś joinami)
cool.gif zrobi coś z tymi danymi
c) zaktualizuje te rekordy w tabeli

No i chodziło to na jednym procesie ale całość była niewydajna. W związku z tym rozdzieliłem wszystko na wiele podprocesów i zauważyłem dziwną anomalię...
Wszystkich procesów uruchamiam np. 30 i wszystkie wykonują się dość szybko - czas to od 0.02 do maks 0.2 sekundy. Jednak w pewnym momencie dochodzi do dziwnej sytuacji, a mianowicie jedno zapytanie (wszystkie są takie same) się przywiesza i trwa około 107 sekund. 4 inne trwają po 28 sekund. I nagle zapytania te odpuszczają (zwracają 0 rekordów, co jest rzeczą normalną). Reszta zapytań wykonuje się dość szybko.

Czy spotkał się ktoś z taką sytuacją lub wie, co może być przyczyną takiego zachowania?

Napisany przez: trueblue 12.07.2020, 13:50:08

Deadlocki?

Napisany przez: Valantir 12.07.2020, 14:11:22

Czy w tym momencie baza rzuciłaby jakimś błędem? Bo ja żadnego wyjątku nie dostaję. Poza tym wyciągając selectem dane dodaję warunek, który eliminuje możliwość działania dwóch procesów na tym samym rekordzie.

Napisany przez: trueblue 12.07.2020, 15:01:11

To jest tabela InnoDB?

Zapytanie ma jakieś podselect?

Napisany przez: Valantir 12.07.2020, 15:40:50

Tak, InnoDB. I tak, ma jeden podselect.

Napisany przez: trueblue 12.07.2020, 15:47:21

Ten podselect w update i dotyczy samej tabeli co nadrzędny update?

Napisany przez: Valantir 12.07.2020, 16:10:16

Problemy są z samym selectem.
Leci coś w stylu:

select x, y, z from (subselect z wherem i limitem) as t1 join t2 join t3 join t4 where x = 'test'

update potem leci ok

Napisany przez: trueblue 12.07.2020, 16:35:51

A indeksy są pozakładane?

Napisany przez: Valantir 13.07.2020, 20:25:21

Tak, indeksy są pozakładane - dlatego pierwsze zapytanie wykonuje się nawet w 0.02 sekundy. Razem jest uruchamianych około 27 procesów, z czego 23 lecą dość szybko (po wykonaniu selecta zapytanie zwraca 0 rekordów), a 4 wiszą - 3 z nich po około 70-80 sekundach się wykonuje, a czwarte po około 1300 sekundach...

Napisany przez: trueblue 14.07.2020, 10:15:09

Pokaż wynik EXPLAIN SELECT ... jednego z tych wolnych zapytań.
Kiedy wykonujesz je "samodzielnie", to działa szybko?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)