Jump to content
  • 0

Statystyki użycia filtrotwania produktów obciążenie bazy


TimonP

Question

W jaki sposób mogę zobaczyć jak często klienci używali filtrowania produktów. Chodzi mi o to, że wszelkiego rodzaju filtry mogą obciążać bazę, ponieważ jest to dodatkowe zapytanie, a jeżeli jest wiele elementów w funkcjach to zapytanie "przemielenie zapytania" zajmuje więcej czasu. Tak, mi się przynajmniej wydaje, jeżeli myślę źle to proszę mnie poprawić.

Link to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0
1 godzinę temu, TimonP napisał:

W jaki sposób mogę zobaczyć jak często klienci używali filtrowania produktów. Chodzi mi o to, że wszelkiego rodzaju filtry mogą obciążać bazę, ponieważ jest to dodatkowe zapytanie, a jeżeli jest wiele elementów w funkcjach to zapytanie "przemielenie zapytania" zajmuje więcej czasu. Tak, mi się przynajmniej wydaje, jeżeli myślę źle to proszę mnie poprawić.

Jeżeli mówisz o nawigacji fasetowej od prestashop, to najbardziej obciąża część odpowiedzialna za ładowanie informacji z tabeli stock_available. Jeszcze jedna sprawa, chodzi ci o początkowe ładowanie strony czy już przetwarzanie zapytania po wybraniu filtrów przez użytkownika?

Link to comment
Share on other sites

  • 0

W sumie i to i to, ostatnio mam dość duże obciążenie na hostingu ze względu na dużą liczbę zapytań PHP. Stronę odseparowano na inną maszynę aby nie zakłócać pracy innych stron. Zmniejszenie cech w funkcjach, liczba funkcji lub rozdrobnienie funkcji ze względu na kategorię produktu,  wydaje mi się, że będzie miało na to wpływ. Najprawdopodobniej usuniemy lub wyłączymy kilka funkcji. Spróbuje wyciągnąć informacje o filtrowaniach przez GA4 w Zdarzeniach. Zauważyłem, że w wynikach filtrowania fasetowego w adresie sklepu pojawia się ?q=.

Link to comment
Share on other sites

  • 0

Jeżeli chodzi po początkowe ładowanie możesz nadpisać src/Adapter/MySQL.php w module i wyłączyć ją z zapytania sql. Poprawi to wydajność i kompleksowośc zapytania. W przypadku wybrania filtrów masz już konkretne warunki więc powinno być lepiej.

use Tools;
    public function useFiltersAsInitialPopulation()
    {
        // Initial population has no ORDER BY
        $this->setOrderField('');

        // We add basic select fields we will need to matter what
        if(Tools::isSubmit('from-xhr')){ //fix initial loading speed slow caused by joining quantity table
            $this->setSelectFields(
                [
                    'id_product',
                    'id_manufacturer',
                    'quantity',
                    'condition',
                    'weight',
                    'price',
                    'sales',
                    'on_sale',
                    'date_add',
                ]
            );
        }else{
            $this->setSelectFields(
                [
                    'id_product',
                    'id_manufacturer',
                    //'quantity',
                    'condition',
                    'weight',
                    'price',
                    'sales',
                    'on_sale',
                    'date_add',
                ]
            );            
        }

        // Clone it, add it to initial population
        $this->initialPopulation = clone $this;

        // Reset all filters so we start clean and add only the base select, we don't need anything else
        $this->resetAll();
        $this->addSelectField('id_product');
    }
    protected function computeShowLast($orderField, $filterToTableMapping)
    {

        return $orderField;//disabling option for initial loading performance
        // allow only if feature is enabled & it is main product list query
        if ($this->getInitialPopulation() === null
            || empty($orderField)
            || !Configuration::get('PS_LAYERED_FILTER_SHOW_OUT_OF_STOCK_LAST')
        ) {
            return $orderField;
        }

        $this->addSelectField('out_of_stock');

        // order by out-of-stock last
        $computedQuantityField = $this->computeFieldName('quantity', $filterToTableMapping);
        $byOutOfStockLast = 'IFNULL(' . $computedQuantityField . ', 0) <= 0';

        /**
         * Default behaviour when out of stock
         * 0 - when deny orders
         * 1 - when allow orders
         *
         * @var int
         */
        $isAvailableWhenOutOfStock = (int) Product::isAvailableWhenOutOfStock(2);

        // computing values for order by 'allow to order last'
        $computedField = $this->computeFieldName('out_of_stock', $filterToTableMapping);
        $computedValue = $isAvailableWhenOutOfStock ? 0 : 1;
        $computedDirection = $isAvailableWhenOutOfStock ? 'ASC' : 'DESC';

        // query: products with zero or less quantity and not available to order go to the end
        $byOOPS = str_replace(
            [':byOutOfStockLast', ':field', ':value', ':direction'],
            [$byOutOfStockLast, $computedField, $computedValue, $computedDirection],
            ':byOutOfStockLast AND FIELD(:field, :value) :direction'
        );

        $orderField = $byOutOfStockLast . ', '
            . $byOOPS . ', '
            . $orderField;

        return $orderField;
    }

 

Link to comment
Share on other sites

  • 0

1. Jak wyłączyć z zapytania SQL? Jeżeli wchodzę na stronę to przeglądarka odpytuje jakie produkty są na stronie, opis, cena. To wszystko jest w bazie.

2. Nie chce niczego zmieniać / dopisywać do kodu.

Link to comment
Share on other sites

  • 0
36 minut temu, TimonP napisał:

1. Jak wyłączyć z zapytania SQL? Jeżeli wchodzę na stronę to przeglądarka odpytuje jakie produkty są na stronie, opis, cena. To wszystko jest w bazie.

2. Nie chce niczego zmieniać / dopisywać do kodu.

bez nadpisania nie wyłączysz. Funkcja useFiltersAsInitialPopulation() przy pierwszym ładowaniu pobiera dane z tabeli stock_available. Musisz zmienić w kodzie 'quantity', aby funkcja nie dodawała tej tabeli.

Filtr nawigacji wysyła zapytanie do bazy danych na podstawie kategorii, aby pobrać informacje jakie filtry ma wygenerować na danej stronie.
Druga sprawa jak odpalisz debug profiler, to pokaże ci które zapytania SQL są wywoływane i obciążają serwer.

Edited by WisQQ (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...