Cześć
Od paru dni walczę z bardzo wolnym updatem w MySQL.
Temat wygląda następująco.
Mam listę asortymentu w pliku csv kolumny to kod_towaru, jakiś tam opis, ilość itd.
Wrzucam to do tabeli csv_tmp.
Następnie chce zrobić update na tabeli 1_towary w której zmieniam pole siAKT na podstawie ilości z csv_tmp oraz stan z tabeli 1_magazyny_stany.
Przybliżona ilość rekordów w każdej tabeli:
csv_tmp ~ 12k
1_towary ~25k
1_magazyny_stany ~50k
Zapytanie wygląda następująco (piszę z pamięci może być jakiś drobny błąd)
Update `1_towary` t
INNER JOIN `1_magazyny_stany` m on m.id_towaru = t.id
INNER JOIN `csv_tmp` c on c.v1 = t.kod_towaru
Set t.data_modyfikacji = NOW(),
Set siAkt = select CASE
WHEN m.stan = 0 and c.v3 = 0
THEN 0
ELSE 1
END
Zapytanie wykonuje testowo na zwykłym laptopie i XAMPP, i na chwilę obecną wykonuje się ok. 6000s.
Moje pytanie brzmi czy idzie to jakoś zoptymalizować, czy testować od razu na środowisku serwerowym?
Ps. Próbowałem również stworzyć widok dane
z
select CASE
WHEN m.stan = 0 and c.v3 = 0
THEN 0
ELSE 1
END as aktywnosc, t.kod_towaru,t.siAkt,m.stan,c.v3
from `1_towary` t
inner join `1_magazyny_stany` m on m.id_towaru = t.id
inner join `csv_tmp` c on c.v1 = t.kod_towaru
i pisać zapytanie w ten sposób:
Update `1_towary` t
INNER join d on t.kod_towaru = d.kod_towaru
SET t.data_modyfikacji = NOW(),
SET siAKt = d.aktywnosc
ale powyższy sposób wykonuje się w podobnym czasie
PS2. Próbowałem zmieniać ustawienia lokalnego mysql m.in ilość wykorzystywanej pamięci, rozmiar bufora itd ale nie przyniosło to oczekiwanego efektu.