dla lepszej wydajności możesz spróbować użyć indeksu złożonego opartego na kolumnie zawartej w klauzuli where
i spróbować zmienić klauzulę IN w sprzężeniu wewnętrznym
zakładając, że treść klauzuli IN jest zbiorem stałych wartości możesz użyć union (lub nowej tabeli z potrzebną wartością)
np. używając unii (możesz zrobić coś podobnego, jeśli klauzula IN jest podzapytaniem)
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;
możesz również dodać indeks złożony do tabeli user_table w kolumnach
colA, colB, colC
co jest związane z elementem używanym przez optymalizator zapytań mysql, aby wybrać indeks, aby użyć tam kilku aspektów, a dla wszystkich tych optymalizator zapytań przypisze koszt
wszystko, co należy wziąć pod uwagę
- kolumna związana z klauzulą Where
- Rozmiar stołów (a nie rozmiar stołów w łączeniu)
- Oszacowanie, ile wierszy zostanie pobranych (aby zdecydować, czy użyć indeksu, czy po prostu zeskanować tabelę)
- czy typy danych pasują, czy nie między kolumnami w klauzuli jion i where
- Użycie funkcji lub konwersji typu danych, w tym niezgodność sortowania
- Rozmiar indeksu
- liczność indeksu
i dla wszystkich tych opcji wyceniany jest koszt i to prowadzi do indeksu wybierz
W twoim przypadku colC jako data może oznaczać konwersję danych (przestrzegaj wartości literałów jako string) i do tego indeks nie jest wybrany ..
W tym celu zasugerowałem również indeks złożony z kolumną po lewej stronie odnoszącą się do nieprzekonwertowanych wartości