за по-добра производителност можете да опитате да използвате съставен индекс .. въз основа на колоната, включена във вашата клауза where
и опитайте да промените клаузата IN във вътрешно съединение
приемайки, че съдържанието на вашата клауза IN е набор от фиксирани стойности можете да използвате обединение (или нова таблица със стойността, от която се нуждаете)
напр. използване на обединението (можете да направите нещо подобно, ако клаузата IN е подзаявка)
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;
можете също да добавите съставен индекс към таблица user_table върху колони
colA, colB, colC
за какво е свързано с елемента, използван от mysql оптимизатора на заявки за решаване на индекса да използва там няколко аспекта и за всички тях оптимизаторът на заявки присвоява цена
всичко, което трябва да вземете под внимание
- колоната, включена в клаузата Where
- Размерът на таблиците (и не големия случай размерът на таблиците в съединението)
- Приблизителна оценка за това колко реда ще бъдат извлечени (за да решите дали да използвате индекс или просто да сканирате таблицата)
- ако типовете данни съвпадат или не между колоните в клаузата jion и where
- Използване на преобразуване на функция или тип данни, включително несъответствие на съпоставяне
- Размерът на индекса
- кардиналност на индекса
и за всички тези опции се оценява цената и това води до индекса, изберете
Във вашия случай colC като дата може да предполага преобразуване на данни (спазвайте литералните стойности като низ) и за това индексът не е избран..
Също така за това предложих съставен индекс с най-лявата колона, свързана с неконвертирани стойности