パフォーマンスを向上させるには、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はデータ変換を意味する可能性があり(リテラル値を文字列として尊重します)、この場合、インデックスは選択されません..
このために、変換されていない値に関連する左端の列を持つ複合インデックスを提案しました