voor betere prestaties kunt u proberen samengestelde index te gebruiken .. gebaseerd op de kolom die betrokken is bij uw waar-clausule
en probeer de IN-clausule in een inner join te wijzigen
ervan uitgaande dat de inhoud van uw IN-clausule een set vaste waarden is je zou unie kunnen gebruiken (of een nieuwe tabel met de waarde die je nodig hebt)
bijv. de unie gebruiken (u kunt iets soortgelijks doen als de IN-clausule een subquery is)
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;
je zou ook een samengestelde index kunnen toevoegen aan de tabel user_table op kolommen
colA, colB, colC
voor wat gerelateerd is aan het element dat wordt gebruikt door mysql query-optimizer om de index te bepalen om daar verschillende aspecten te gebruiken en voor al deze wijst de query-optimizer kosten toe
alles waar u rekening mee moet houden
- de kolom betrokken bij Where-clausule
- De grootte van de tabellen (en niet de grootte van de tabellen in join)
- Een schatting van het aantal rijen dat wordt opgehaald (om te beslissen of u een index wilt gebruiken of gewoon de tabel wilt scannen)
- of de datatypes al dan niet overeenkomen tussen kolommen in de jion en where-clausule
- Het gebruik van functie- of gegevenstypeconversie, inclusief onjuiste sortering
- De grootte van de index
- kardinaliteit van de index
en voor al deze opties wordt een kostprijs geëvalueerd en dit leidt tot de index kies
In uw geval zou de colC als datum een dataconversie kunnen zijn (respecteer de letterlijke waarden als string ) en hiervoor is de index niet gekozen ..
Is ook hiervoor dat ik een samengestelde index heb voorgesteld met de meest linkse kolom gerelateerd aan niet-geconverteerde waarden