Entah artikel yang Anda baca menggunakan contoh yang buruk, atau Anda salah mengartikan maksud mereka.
select username from users where company = 'bbc' or company = 'itv';
Ini setara dengan:
select username from users where company IN ('bbc', 'itv');
MySQL dapat menggunakan indeks di company
untuk permintaan ini baik-baik saja. Tidak perlu melakukan UNION.
Kasus yang lebih rumit adalah di mana Anda memiliki OR
kondisi yang melibatkan dua berbeda kolom.
select username from users where company = 'bbc' or city = 'London';
Misalkan ada indeks di company
dan indeks terpisah di city
. Mengingat MySQL biasanya hanya menggunakan satu indeks per tabel dalam kueri tertentu, indeks mana yang harus digunakan? Jika menggunakan indeks di company
, itu masih harus melakukan pemindaian tabel untuk menemukan baris di mana city
adalah London. Jika menggunakan indeks di city
, itu harus melakukan pemindaian tabel untuk baris di mana company
adalah bbc.
UNION
solusinya adalah untuk jenis kasus ini.
select username from users where company = 'bbc'
union
select username from users where city = 'London';
Sekarang setiap sub-kueri dapat menggunakan indeks untuk pencariannya, dan hasil dari subkueri digabungkan dengan UNION
.
Seorang pengguna anonim mengusulkan pengeditan untuk jawaban saya di atas, tetapi seorang moderator menolak pengeditan tersebut. Seharusnya komentar, bukan editan. Klaim dari pengeditan yang diusulkan adalah bahwa UNION harus mengurutkan set hasil untuk menghilangkan baris duplikat. Ini membuat kueri berjalan lebih lambat, dan oleh karena itu pengoptimalan indeks tidak berhasil.
Tanggapan saya adalah bahwa indeks membantu mengurangi hasil yang disetel ke sejumlah kecil baris sebelum UNION terjadi. UNION sebenarnya menghilangkan duplikat, tetapi untuk melakukan itu hanya perlu mengurutkan kumpulan hasil kecil. Mungkin ada kasus di mana klausa WHERE cocok dengan sebagian besar tabel, dan menyortir selama UNION sama mahalnya dengan hanya melakukan pemindaian tabel. Tetapi lebih umum untuk hasil yang ditetapkan dikurangi oleh pencarian yang diindeks, sehingga pengurutan jauh lebih murah daripada pemindaian tabel.
Perbedaannya tergantung pada data dalam tabel, dan istilah yang dicari. Satu-satunya cara untuk menentukan solusi terbaik untuk kueri tertentu adalah dengan mencoba kedua metode di profiler kueri MySQL dan bandingkan kinerjanya.