Wow! Itu adalah "penggabungan indeks" paling rumit yang pernah saya lihat.
Biasanya (mungkin selalu ), Anda dapat membuat indeks 'gabungan' untuk menggantikan indeks-gabungan-berpotongan, dan berkinerja lebih baik . Ubah key2
dari hanya (pinned)
ke (pinned, DeviceId)
. Ini mungkin singkirkan 'persimpangan' dan percepat.
Secara umum, Pengoptimal menggunakan penggabungan indeks hanya dalam keputusasaan. (Saya rasa ini adalah jawaban untuk pertanyaan judul.) Setiap perubahan kecil pada kueri atau nilai yang terlibat, dan Pengoptimal akan menjalankan kueri tanpa penggabungan indeks.
Peningkatan pada tabel temp __codes
adalah membuat tabel permanen dengan rentang nilai yang besar, lalu menggunakan rentang nilai dari tabel tersebut di dalam Proc Anda. Jika Anda menggunakan MariaDB, gunakan tabel "urutan" yang dibuat secara dinamis. Misalnya 'tabel' seq_1_to_100
adalah efektif tabel satu kolom dengan nomor 1..100. Tidak perlu mendeklarasikan atau mengisinya.
Anda dapat menyingkirkan REPEAT
lainnya loop dengan komputasi waktu dari Code
.
Menghindari LOOPs
akan menjadi manfaat kinerja terbesar.
Selesaikan semuanya, mungkin saya punya tips lain.