SQL – Efektivní dotaz na výběr statických dat podle dnu / měsíce / roku
- Dan Hundrt
- Člen | 74
Zdravím,
rád bych se zeptal, zdali lze vůbec efektivně vybrat data z tabulky, která vypadá takto:
https://i.ibb.co/…20-27-56.png
Řeším výběr dat – potřeboval bych vytáhnout efektivně data od – do podle sloupce day, month, year podle uživatele s tím, že by na výstupu byl SUM(sum_basket) a SUM(page_view) vždy po dnech.
Aktuálně je logika udělaná tak, že se ve for cyklu proiterují záznamy od – do a v každé iteraci se vypočítám SUM, což vzhledem k počtu řádků v DB je poměrně náročné (co iterace to SQL dotaz).
Nevíte, zda to lze řešit návrh efektivněji?
Filtrace od – do může být variabilní, iterovat např. půl roku by výkonově nedávalo smysl.
Děkuji za případnou odpověď
- h4kuna
- Backer | 740
Na obrázku chybí sloupeček sum_basket, nemělo to být SUM(basket_counter)?
Jen se ujistím. Předpokládejme že id 60 a 87 vícekrát v tabulce nejsou a pokud ty udělám výběr tak pro 1.1.2022 by měl být výsledek SUM(basket_counter) → 4 a SUM(page_view) → 200. Pokud je to tak, tak by to měl být jednoduchý dotaz.
SELECT SUM(basket_counter), SUM(page_view) FROM table
WHERE condition
GROUP BY year, month, day
Tady je otázka na to jak vybrat rozsah? Asi by stačilo nad sloupce
year
, month
a day
dát složený index a
pak rozepsat podmíny na rozsah datumů nebo… Mysql podporuje generované sloupce a to bych asi udělal. Tj, udělal bych
si date sloupec z těch year, month a day. Na tento nový sloupec jde dát
index. Tento nový sloupec lehce použiješ ve WHERE a pak se ti i lépe bude
převádět na datetime při vývěru. V group by půjde taky použít.
Ale myslím si že by to mělo fungovat i s tím složeným indexem a původními třemi sloupci, jen je s tím trochu více práce, když jsou sloupce takto rozděleny.
Editoval h4kuna (6. 2. 2022 8:51)
- Dan Hundrt
- Člen | 74
Zdravím,
díky za nakopnutí. Nakonec udělám agregační tabulku, těch dat je poměrně hodně.