Odkazy: dibi | API reference

Forum: [česky] [english]

dibi fórum

tiny ‘n’ smart
database layer

Nejste přihlášen(a)

#1 před 8 měsíci

marau
Člen
Registrovaný: 17. 10. 2010
Příspěvky: 40

Optimalizace dotazu napříč tabulkami

Zdarvím,
mám následující dotaz (MySQL):

SELECT MAX(products.price_czk)
FROM products p
LEFT JOIN products_join pj ON p.id = pj.products_id
WHERE (p.is_visible = 1) AND (pj.projects_id = 2) AND
(pj.products_categories_id IN (1, 11, 31, 40, 12, 32, 41, 13, 33, 42, 14, 34, 15, 35, 16,
36, 17, 37, 18, 38, 19, 39, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30))

V tabulce products Mám zhruba 200tis záznamů, v tabulce products_join je kolem 300tis. V tabulce products mám index
 – price_czk,is_visible

V tabulce products_join pak
 – products_categories_id, products_id, projects_id

Cizí klíč
products.id, products_join.products_id

Potřebuji zjišťovat maximální cenu podle kontextu kvůli range filteru, pokud ale dotazu vyhovuje například 60tis záznamů, je dotaz pomalý a nepoužije se index a to je problém. Jaké jsou mé možnosti tento dotaz zoptimaizovat? Díky.

Editoval marau (20. 9. 2011 13:12)

 

#2 před 8 měsíci

LuKo
Člen
Registrovaný: 30. 9. 2008
Příspěvky: 114

Re: Optimalizace dotazu napříč tabulkami

Předělal bych indexy na

products: index(id, is_visible, price_czk)
products_join: index(project_id, products_categories_id, products_id)

Na pořadí sloupců v indexech záleží. Vyzkoušej…

 

#3 před 8 měsíci

Milo
dibi guru
Registrovaný: 4. 5. 2010
Příspěvky: 298

Re: Optimalizace dotazu napříč tabulkami

Můžeš použít JOIN namísto LEFT JOIN, protože NULL stejně odfiltruješ podmínkou.
INDEX(is_visible, price_czk)
INDEX(projects_id)
INDEX(products_categories_id)

Ale jestli máš ty dva poslední jako cizí klíče tak tam už stejně indexy jsou. Možná pomůže i OPTIMIZE TABLE.

 

Zápatí