pro lepší výkon můžete zkusit použít složený index .. na základě sloupce zahrnutého ve vaší klauzuli where
a zkusit změnit klauzuli IN ve vnitřním spojení
za předpokladu, že obsah klauzule IN je sada pevných hodnot můžete použít union (nebo novou tabulku s hodnotou, kterou potřebujete )
např. pomocí sjednocení (můžete udělat něco podobného, pokud je klauzule IN poddotaz)
select user_table.colA ,ColB , count(*) as count
from user_table
INNER JOIN (
select 'FIXED1' colA
union
select 'FIXED2'
....
union
select 'FIXEDX'
) t on t.colA = user_table.colA
where colC >='2019-09-01 00:00:00'
and ColB = 17
group by colA ,ColB;
můžete také přidat složený index do tabulky user_table na sloupcích
colA, colB, colC
pro to, co souvisí s prvkem používaným optimalizátorem dotazů mysql, pro rozhodnutí indexu použít několik aspektů a pro všechny tyto aspekty optimalizátor dotazů přiřadí cenu
jakékoli, co byste měli vzít v úvahu
- sloupec zahrnutý v klauzuli Where
- Velikost tabulek (a nikoli velikost tabulek ve spojení)
- Odhad, kolik řádků bude načteno (pro rozhodnutí, zda použít index, nebo jednoduše prohledat tabulku)
- zda se datové typy shodují nebo neshodují mezi sloupci v klauzuli jion a where
- Použití konverze funkcí nebo datových typů včetně nesprávného řazení
- Velikost indexu
- kardinalita indexu
a pro všechny tyto možnosti je vyhodnocena cena a to vede k indexu zvolit
Ve vašem případě by colC jako datum mohlo implikovat konverzi dat (respektujte doslovné hodnoty jako řetězec ) a proto není zvolen index ..
Proto jsem také navrhl složený index se sloupcem nejvíce vlevo souvisejícím s nepřevedenými hodnotami