Nejste přihlášen(a)
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
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)
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…
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.