för bättre prestanda kan du prova att använda sammansatt index .. baserat på kolumnen som är involverad i din where-sats
och försöka ändra IN-satsen i en inre join
förutsatt att innehållet i IN-satsen är en uppsättning fasta värden du kan använda union (eller en ny tabell med det värde du behöver)
t.ex. genom att använda unionen (du kan göra något liknande om IN-satsen är en underfråga)
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;
du kan också lägga till ett sammansatt index i tabellen user_table på kolumner
colA, colB, colC
för vad som är relaterat till element som används av mysql query optimizer för att bestämma indexet för att använda det flera aspekter och för alla dessa tilldelar frågeoptimeraren en kostnad
alla vad du bör ta i beaktande
- kolumnen som ingår i Where-satsen
- Storleken på tabellerna (och inte yiuy fallet storleken på tabellerna i join)
- En uppskattning av hur många rader som kommer att hämtas (för att bestämma om ett index ska användas eller helt enkelt skanna tabellen)
- om datatyperna matchar eller inte mellan kolumner i jion och where-satsen
- Användningen av funktions- eller datatypskonvertering inklusive fel vid sortering
- Storleken på indexet
- kardinalitet av indexet
och för alla dessa alternativ utvärderas en kostnad och detta leder till att indexet väljer
I ditt fall innebär kolC som datum en datakonvertering (respektera de bokstavliga värdena som sträng ) och för detta är indexet inte valt ..
Är också för detta som jag har föreslagit ett sammansatt index med kolumnen längst till vänster relaterat till icke-konverterade värden