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

Menghindari Pertanyaan Bersarang

Itu sangat tergantung, saya memiliki situasi di mana saya meningkatkan beberapa kueri dengan menggunakan subkueri.

Faktor-faktor yang saya ketahui adalah:

  • apakah subkueri menggunakan bidang dari kueri luar untuk perbandingan atau tidak (berkorelasi atau tidak)
  • jika hubungan antara kueri luar dan subkueri dicakup oleh indeks
  • jika tidak ada indeks yang dapat digunakan pada gabungan dan subkueri tidak berkorelasi dan mengembalikan hasil kecil, mungkin akan lebih cepat untuk menggunakannya
  • Saya juga mengalami situasi di mana mengubah kueri yang menggunakan perintah dengan menjadi kueri yang tidak menggunakannya dan kemudian mengubahnya menjadi subkueri sederhana dan pengurutan yang meningkatkan kinerja di mysql

Bagaimanapun, selalu baik untuk menguji varian yang berbeda (tolong dengan SQL_NO_CACHE), dan mengubah kueri yang berkorelasi menjadi gabungan adalah praktik yang baik.

Saya bahkan akan menyebutnya sebagai praktik yang sangat berguna.

Mungkin saja jika kueri berkorelasi adalah yang pertama kali muncul di benak Anda bahwa Anda tidak terutama berpikir dalam hal operasi himpunan, tetapi terutama dalam hal operasi prosedural dan ketika berhadapan dengan database relasional, sangat berguna untuk sepenuhnya mengadopsi himpunan. perspektif model data dan transformasinya.

EDIT:Prosedural vs Relasional
Berpikir dalam hal operasi himpunan vs prosedural bermuara pada kesetaraan dalam beberapa ekspresi aljabar himpunan, misalnya seleksi pada gabungan setara dengan gabungan pilihan. Tidak ada perbedaan antara keduanya.
Tetapi ketika Anda membandingkan dua prosedur, seperti menerapkan kriteria seleksi untuk setiap elemen serikat pekerja dengan membuat serikat dan kemudian menerapkan seleksi, keduanya adalah prosedur yang jelas berbeda, yang mungkin memiliki sifat yang sangat berbeda (misalnya penggunaan CPU, I/O, memori).

Ide di balik database relasional adalah bahwa Anda tidak mencoba untuk menjelaskan bagaimana mendapatkan hasil (prosedur), tetapi hanya apa yang Anda inginkan, dan bahwa sistem manajemen database akan memutuskan jalur terbaik (prosedur) untuk memenuhi permintaan Anda. Inilah mengapa SQL disebut bahasa generasi ke-4 (4GL) .

Salah satu trik yang membantu Anda melakukannya adalah dengan mengingatkan diri sendiri bahwa tupel tidak memiliki urutan yang melekat (elemen yang ditetapkan tidak berurutan). Yang lain adalah menyadari bahwa aljabar relasional cukup komprehensif dan memungkinkan terjemahan permintaan (persyaratan) langsung ke SQL (jika semantik dari model Anda mewakili ruang masalah dengan baik, atau dengan kata lain jika makna yang dilampirkan pada nama tabel dan hubungan Anda dilakukan dengan benar, atau dengan kata lain jika database Anda dirancang dengan baik).

Karena itu, Anda tidak perlu memikirkan caranya, cukup apa.

Dalam kasus Anda, itu hanya preferensi atas kueri yang berkorelasi, jadi mungkin saya tidak memberi tahu Anda sesuatu yang baru, tetapi Anda menekankan hal itu, oleh karena itu komentarnya.

Saya pikir jika Anda benar-benar nyaman dengan semua aturan yang mengubah kueri dari satu bentuk ke bentuk lain (aturan seperti distributiveness) bahwa Anda tidak akan memilih subkueri berkorelasi (bahwa Anda akan melihat semua bentuk sama).

(Catatan:di atas membahas latar belakang teoretis, penting untuk desain basis data; secara praktis konsep di atas menyimpang - tidak semua penulisan ulang yang setara dari kueri harus dieksekusi dengan cepat, kunci utama berkerumun membuat tabel mewarisi urutan pada disk, dll ... penyimpangan hanyalah penyimpangan; fakta bahwa tidak semua kueri yang setara dieksekusi secepat adalah ketidaksempurnaan DBMS yang sebenarnya dan bukan konsep di baliknya)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa membatasi pengguna MySQL ke tabel tertentu?

  2. Sintaks Pembaruan Java MySQL

  3. mysqli_connect():(HY000/2002):Waktu koneksi habis di hosting

  4. Bagaimana cara menambahkan lebih dari satu baris dengan Zend_Db?

  5. Memblokir '0000-00-00' dari Kolom Tanggal MySQL