Menurut Bab 9 (Parser dan Pengoptimal), Buku Memahami MySQL Internal oleh Sasha Pachev
di sini adalah rincian evaluasi permintaan sebagai tugas-tugas berikut:
- Tentukan kunci mana yang dapat digunakan untuk mengambil catatan dari tabel, dan pilih yang terbaik untuk setiap tabel.
- Untuk setiap tabel, putuskan apakah pemindaian tabel lebih baik daripada membaca pada kunci. Jika ada banyak catatan yang cocok dengan nilai kunci, keuntungan kunci berkurang dan pemindaian tabel menjadi lebih cepat.
- Menentukan urutan tabel yang harus digabung ketika lebih dari satu tabel ada dalam kueri.
- Tulis ulang klausa WHERE untuk menghilangkan kode mati, mengurangi perhitungan yang tidak perlu dan mengubah kendala sedapat mungkin untuk membuka jalan untuk menggunakan kunci.
- Hilangkan tabel yang tidak digunakan dari bergabung.
- Tentukan apakah kunci dapat digunakan untuk
ORDER BY
dan GROUP BY
.
- Mencoba menyederhanakan subqueries, serta menentukan sejauh mana hasil mereka dapat di-cache.
- Gabungkan tampilan (perluas referensi tampilan sebagai makro)
Pada halaman yang sama, dikatakan sebagai berikut:
Dalam terminologi pengoptimal MySQL, setiap kueri adalah serangkaian gabungan. Istilah join digunakan di sini lebih luas daripada di perintah SQL. Kueri hanya pada satu tabel adalah gabungan yang menurun. Meskipun kami biasanya tidak menganggap membaca catatan dari satu tabel sebagai gabungan, struktur dan algoritma yang sama yang digunakan dengan gabungan konvensional berfungsi dengan baik untuk menyelesaikan kueri dengan hanya satu tabel.
EPILOG
Karena kunci yang ada, jumlah data, dan ekspresi kueri, MySQL Joins kadang-kadang dapat melakukan hal-hal untuk kebaikan kita sendiri (atau untuk membalas kita) dan menghasilkan hasil yang tidak kita harapkan dan tidak dapat dengan cepat dijelaskan.
Saya menulis tentang quirkiness ini sebelumnya
karena Pengoptimal Kueri MySQL dapat menghilangkan kunci tertentu selama evaluasi permintaan.
Komentar @ Phil membantu saya melihat cara mengirim jawaban ini (+1 untuk komentar @ Phil)
Komentar @ ypercube (+1 untuk yang ini juga) adalah versi ringkas dari posting saya karena Pengoptimal Permintaan MySQL adalah primitif. Sayangnya, itu harus karena berurusan dengan mesin penyimpanan luar.
KESIMPULAN
Adapun pertanyaan Anda yang sebenarnya, Pengoptimal Kueri MySQL akan menentukan metrik kinerja setiap permintaan saat selesai
- menghitung baris
- memilih kunci
- memijat set hasil intermiten
- Oh ya, melakukan GABUNGAN yang sebenarnya
Anda mungkin harus memaksa urutan eksekusi dengan menulis ulang (refactoring) kueri
Ini Query pertama yang Anda berikan
select count(*)
from table1 a
join table2 b
on b.key_col=a.key_col
where b.tag = 'Y';
Coba tulis ulang untuk mengevaluasi WHERE dulu
select count(*)
from table1 a
join (select key_col from table2 where tag='Y') b
on b.key_col=a.key_col;
Itu pasti akan mengubah rencana EXPLAIN. Itu bisa menghasilkan hasil yang lebih baik atau lebih buruk.
Saya pernah menjawab pertanyaan di StackOverflow di mana saya menerapkan teknik ini. EXPLAIN itu menghebohkan tetapi performanya dinamit. Ini hanya berfungsi karena memiliki indeks yang benar hadir dan penggunaan LIMIT dalam subquery .
Seperti harga saham, ketika datang ke Permintaan dan mencoba untuk mengungkapkannya, pembatasan berlaku, hasil dapat bervariasi, dan kinerja masa lalu tidak menunjukkan hasil di masa depan.