untuk kinerja yang lebih baik, Anda dapat mencoba menggunakan indeks komposit .. berdasarkan kolom yang terlibat dalam klausa where Anda
dan mencoba mengubah klausa IN dalam gabungan bagian dalam
dengan asumsi konten klausa IN Anda adalah kumpulan nilai tetap anda bisa menggunakan union (atau tabel baru dengan nilai yang anda butuhkan )
misalnya menggunakan gabungan (Anda dapat melakukan hal serupa jika klausa IN adalah subquery)
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;
anda juga dapat menambahkan indeks komposit pada tabel user_table pada kolom
colA, colB, colC
untuk apa yang terkait dengan elemen yang digunakan oleh pengoptimal kueri mysql untuk memutuskan indeks yang akan digunakan di sana beberapa aspek dan untuk semua ini pengoptimal kueri menetapkan biaya
apa pun yang harus Anda pertimbangkan
- kolom yang terlibat dalam klausa Where
- Ukuran tabel (dan bukan ukuran tabel yang di gabung)
- Perkiraan berapa banyak baris yang akan diambil ( untuk memutuskan apakah akan menggunakan indeks, atau hanya memindai tabel )
- jika tipe data cocok atau tidak antara kolom dalam jion dan klausa where
- Penggunaan fungsi atau konversi tipe data termasuk ketidaksesuaian susunan
- Ukuran indeks
- kardinalitas indeks
dan untuk semua opsi ini dievaluasi biaya dan ini mengarah ke indeks pilih
Dalam kasus Anda colC sebagai tanggal dapat menyiratkan konversi data (menghormati nilai literal sebagai string ) dan untuk ini indeks tidak dipilih ..
Juga untuk ini saya telah menyarankan indeks komposit dengan kolom paling kiri terkait dengan nilai yang tidak dikonversi