Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

SQL Performance UNION vs OR

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. transaksi mysql - putar kembali pada pengecualian apa pun

  2. Bagaimana cara memilih baris pertama untuk setiap grup di MySQL?

  3. Cara Mengembalikan Posisi Argumen dalam Daftar Argumen di MySQL

  4. Cara Mengatur Ulang Kata Sandi Root MySQL

  5. Catat semua kueri di mysql