Filtrování, filtrace – rychlost
- Jirik123
- Člen | 4
Ahoj,
resim delsi dobu jeden problem a uz nevim co udelat lepe. Jedna se o filtraci. Funguje mi to spravne, ale vzdy cekam kolem 3–5s – cache vyuzivam. Indexovat dotazy do DB mi neprijde idealni, jelikoz by byla obrovska.
mam vlastnosti:
barva: červená, modrá, zelená
velikost: 20 cm, 30cm, 40cm, 50cm
vaha: 1kg, 2kg, 3kg, 4kg
filtrace: barva, velikost, vaha
logika je:
vyberu si barvu – červenou a poté mi script vypíše všechny produkty v červené barvě. Najde mi to 500 produktů a jako druhý select to zobrazí velikosti. Jenže v tento moment mám problém, jelikož ono si to musí zjistit jaké velikosti má těchto 500 produktů a poté generuje druhý select s velikostmi.
pokud tam budu mít třeba 800 barev, 800 velikostí, 800 váh – tak mi to trvá strašně dlouho… Všiml jsem si, že filtrace např. zde https://www.teek.cz/slunecniky netrvá ani 0,5s.
mi to vždy vypočítává další selecty a na tom se to brzdí. Už asi měsíc se na to snažím přijít, jak tento proces zrychlit.
jsem začátečník v programování, proto se omlouvám za případný špatný dotaz.
- Jirik123
- Člen | 4
trva to nekdy i vice, nyní nejsem u zdrojového kódu, ale stačila by mi informace jestli na to jdu logicky správně a nebo ten proces je špatně.
1/ ve filtru vyberu vlastnost červená
2/ vyskočí mi 500 produktů
3/ z těch 500 produktů to začne zjištovat jestli to splnuje nejakou vahu
napr. 40kg, 30kg atd. zaroven to hned zjistuje jestli to splnuje
i velikost.
cili po vybrani cervene vlastnosti – to zaroven zobrazi dostupne hodnoty pro velikost a vahu. Problem tady nastava s timto pocitanim. Jelikoz ono to musi zjistit jestli tento produkt splnuje jak vahu, tak danou velikost.
A to mam nekdy produkty, ktere maji treba vice vah. Tzn. 40kg, 50kg, 60kg + 30 cm, 40cm,50cm atd.
- nightfish
- Člen | 519
Jirik123 napsal(a):
stačila by mi informace jestli na to jdu logicky správně a nebo ten proces je špatně.
Ve filtru vybereš vlastnost červená, načteš si produkty, které mají červenou variantu (resp. získáš jejich IDčka).
Pak záleží na tom, jestli máš vazby všech vlastností (barva, hmotnost, velikost atd.) na produkty v jedné tabulce nebo máš co vlastnost, to jednu tabulku. V prvním případě provedeš jeden dotaz, kde si získáš všechny vlastnosti a jejich hodnoty, které jsou navázány na produkty s ID z pole IDček (a pak si zřejmě až na úrovni PHP seskládáš povolené hodnoty pro jednotlivé vlastnosti). Ve druhém případě provedeš jeden takovýto dotaz pro každou vlastnost.
Všechny tyhle dotazy budou využívat index na poli id_produktu
a poběží v řádech desítek až nízkých stovek milisekund. Pokud ne, je
něco špatně a bez podrobnějších údajů o datovém modelu a typu
pokládaných dotazů to nevyřešíme.
- Jirik123
- Člen | 4
Tabulky jsou feature, feature_value, product_feature a product. Ve feature_value jsou FK feature, feature_value a product. Dotaz vypadá nějak takto
SELECT COUNT(DISTINCT (p0_.id)) AS sclr_0
FROM product_variant p1_
LEFT JOIN product p0_ ON p1_.product_id = p0_.id
LEFT JOIN product_category p6_ ON p0_.id = p6_.product_id
LEFT JOIN product_feature p9_ ON p0_.id = p9_.product_id
LEFT JOIN availability a10_ ON p1_.availability_id = a10_.id
WHERE p1_.is_product = 1 AND p6_.category_id IN (131, 134, 135, 137, 138, 139, 140, 142, 143, 161,
191, 192, 193, 194, 208, 195, 196, 197, 198, 199, 209, 307, 200, 201, 202, 203, 204, 301, 205, 206,
207, 210, 211, 212, 213, 214) AND (EXISTS (
SELECT p11_.product_id AS sclr_1
FROM product_feature p11_
WHERE p0_.id = p11_.product_id AND p11_.feature_id = 49 AND p11_.value IN (40))) AND p0_.brand_id IN
(179)
ORDER BY p6_.position ASC
LIMIT 1
Tímhle se zjišťuje počet produktů pro každou kombinaci filtrů (v tomto případě je ve filtru vybraná značka s id 179 a zjituje se počet produktů s touto značkou a zároveň s hodnotou s id 40 vlastnosti s id 49).
Možná nebude problém s dotazem, ale s jejich počtem. V jednom eshopu je třeba 800 takových hodnot u jedné vlastnosti.
Editoval Jirik123 (5. 11. 2018 10:55)
- Lukes
- Silver Partner | 68
Být tebou, tak to postupně rozeberu na části a měřím, která část dotazu asi je nejkritičtější. Někdy je rychlejší udělat 2 menší dotazy, jak jeden velký. Osobně se mi nelíbí moc ten poddotaz (Přiznám se, že takto jsem to nikdy nepoužil, ale kdybych to měl řešit, začnu u něj). Samozřejmě hodně záleží i na tom, jak jsou nastavené klíče a indexy.
Editoval Lukes (5. 11. 2018 17:34)