Portál AbcLinuxu, 17. května 2025 15:13
SELECT * FROM t_tabulka WHERE hodnota1 = 1 AND hodnota2 = 1
indexy se spravne pouziji a dotaz se provede rychle...
Ovsem pokud pouziji: SELECT * FROM t_tabulka WHERE hodnota1 = 1 OR hodnota2 = 1
tak k pouziti indexu nedojde presto ze to po MySQL pozaduji pres USE INDEX()
Co delam spatne nebo co jsem na MySQL nepochopil? Muze toto nekdo osvetlit proc pri AND dochazi k pouziti indexu a pri OR ne?
Řešení dotazu:
SELECT * FROM tabulka WHERE hodnota1 = c1 UNION SELECT * FROM tabulka WHERE hodnota2 = c2
Další možnost pro OR operaci je použití bitmap indexů. MySQL pokud vím nemá přímo bitmap indexy ale má index merge. Podívejte se odkaz.
Pro AND podmínku (s rovnostmi) ideálně potřebujete složený index z polí (hodnota1, hodnota2)
. Alternativně je možno mít i dva samostatné indexy a nechat optimalizátor ať si podle selektivity vybere ten vhodnější.
Pro OR podmínku potřebuje dva samostatné indexy a doufat, že se optimalizátor rozhodne pro zmíněný index_merge. Posbírejte statistiky nad těmi sloupci (a indexy pokud to MySQL umí) a doufejte. Pokud bude selektivita malá tj. aplikací jednoduché podmínky (operandu OR) odpadne nejvýše 60% záznamů, tak bych hádal že i tak to skončí na full table scan (= bez použití indexu).
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.