tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Forum: [česky] [english]

Optimalizace dotazu napříč tabulkami

1. před 3 lety

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

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 3 lety

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

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 3 lety

Milo
Moderator
Registrovaný: 4. 5. 2010
Příspěvky: 732

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í

Switch to desktop