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

Mysql Exists vs IN -- subquery vs subquery berkorelasi?

Ini adalah jawaban agnostik RDBMS, tetapi tetap dapat membantu. Dalam pemahaman saya, subkueri yang berkorelasi (alias, dependen) mungkin merupakan penyebab yang paling sering dituduh sebagai penyebab kinerja buruk.

Masalahnya (seperti yang paling sering dijelaskan) adalah bahwa ia memproses kueri dalam untuk setiap baris kueri luar. Oleh karena itu, jika kueri luar mengembalikan 1.000 baris, dan kueri dalam mengembalikan 10.000, maka kueri Anda harus bekerja keras melalui 10.000.000 baris (luar×dalam) untuk menghasilkan hasil. Dibandingkan dengan 11.000 baris (luar+dalam) dari kueri yang tidak berkorelasi pada kumpulan hasil yang sama, itu tidak bagus.

Namun, ini hanya skenario terburuk. Dalam banyak kasus, DBMS akan dapat mengeksploitasi indeks untuk mengurangi jumlah baris secara drastis. Bahkan jika hanya kueri dalam yang dapat menggunakan indeks, 10.000 baris menjadi ~13 pencarian, yang menurunkan total menjadi 13.000.

exists operator dapat menghentikan pemrosesan baris setelah baris pertama, mengurangi biaya kueri lebih lanjut, terutama bila sebagian besar baris terluar cocok dengan setidaknya satu baris dalam.

Dalam beberapa kasus yang jarang terjadi, saya telah melihat SQL Server 2008R2 mengoptimalkan subkueri berkorelasi ke gabungan gabungan (yang melintasi kedua set hanya sekali - skenario terbaik) di mana indeks yang sesuai dapat ditemukan di kueri dalam dan luar.

Penyebab sebenarnya dari kinerja buruk belum tentu subkueri berkorelasi , tetapi pemindaian bertingkat .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa alternatif klausa LIMIT di JPQL?

  2. Bagaimana cara mengubah susunan semua baris dari latin1_swedish_ci ke utf8_unicode_ci?

  3. mySQL pilih rentang IN

  4. Looping Over Hasil Set di MySQL

  5. Bagaimana cara mengirim data dari android ke server mysql?