Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [PHP][MySQL]Najbardziej optymalne wyszukiwanie

Napisany przez: Puchatek 18.01.2021, 17:39:24

Witam,
posiadam tabelę w mysql z produktami do sklepu internetowego. Tabela zawiera około 60 tysięcy rekordów. Jeden rekord to jeden produkt.
Raz dziennie odbywają się aktualizacje cen oraz stanów magazynowych. Dane te pobierane są z kilkunastu plików XML. W tabeli jest informacja, w którym pliku znajdują się dane dotyczące produktu.

Szukam zatem najbardziej optymalnego rozwiązania do aktualizacji stanów magazynowych oraz cen.

Pierwsza metoda, której próbowałem to oczywiście przemielenie wszystkich plików XML od góry do dołu oraz UPDATE na tabeli dla każdego produktu.
I mam tutaj pierwsze pytanie - czy bardziej optymalnym rozwiązaniem byłoby w pierwszej kolejności wyszukanie produktu w tabeli w celu porównania danych (czy dane produktu w XMLu uległy zmianie względem tabeli) a później aktualizacja, czy jednak stosowanie UPDATE przy każdym produkcie?

Druga metoda to osobna tabela do stanów i cen. Uprzednio czyszczę całą tabelę a później wrzucam na nowo każdy rekord z XMLa.
Byłoby to dobre rozwiązanie, jednak znacząco utrudnia mi pracę nad listowaniem produktów w danej kategorii. Dajmy na to mam kategorię, do której należy 7000 produktów. Spowalnia to poruszanie się po witrynie ponieważ za każdym razem muszą być wyszukiwane ceny w tabeli liczącej 60tys rekordów, dlatego ta metoda odpada.

I tutaj rodzi się kolejne pytanie, czy może jest jakiś inny sposób, który pozwoliłby mi zaktualizować te dane w tabeli z produktami raz, dobrze i sprawnie?

Napisany przez: trueblue 18.01.2021, 22:56:36

Nie musisz porównywać danych z XML z danymi z bazy. Po prostu zapisuj przy produkcie hash z zawartości pliku XML i porównaj go następnym razem.

Jeśli przy 60 tys. rekordów zauważasz spowolnienie zapytań, to albo te są nieoptymalne, albo struktura bazy danych (indeksy).

Jeszcze inne metoda, to aktualizacja danych produktu, kiedy następuje żądanie o jego dane, np. wyświetlenie strony produktu. Wtedy musiałbyś porównywać hash jak w metodzie wyżej. No i wada taka, że gdybyś to zrobił tylko przy wyświetlaniu podstrony, to mógłbyś mieć nieaktualne dane, jeśli podstrona nie byłaby wyświetlona. Inny problem, to przy dużym ruchu na stronie, następowałaby aktualizacja wielu produktów jednocześnie.

Napisany przez: LowiczakPL 19.01.2021, 15:53:16

Dla 60k rekordów masz 60 zapytań Update w paczkach po 1000 rekordów, ta magiczna liczba była dla mnie najbardziej optymalna liczą, którą kiedyś testowałem. Nie wiem jak teraz może się coś zmieniło w bazach.

Taka aktualizacja powinna trwać około sekundy nikt tego nie zauważy.

Aktualizowałem w ten sposób tabele po kilka milionów rekordów ale wtedy trwało to kilkadziesiąt sekund.

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