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

pernyataan persiapan driver golang sql

Perbedaannya bisa halus, terkadang penting, dan terkadang secara efektif tidak ada.

Secara umum pernyataan yang disiapkan 1. disiapkan dengan server (SQL diurai, rencana eksekusi dibuat, dll.), 2. dieksekusi dengan parameter tambahan, dan kemudian 3. ditutup. Ini memungkinkan Anda menggunakan kembali SQL yang sama dengan parameter berbeda yang diteruskan setiap kali, ini dapat membantu menjaga terhadap injeksi SQL, dapat memberikan beberapa peningkatan kinerja (khusus driver/protokol, YMMV) dan mencegah langkah berulang, seperti dalam pembuatan rencana eksekusi dan penguraian SQL di mempersiapkan langkah di atas.

Untuk seseorang yang menulis kode sumber, pernyataan yang disiapkan mungkin lebih nyaman daripada menggabungkan string dan mengirimkannya ke server DB.

DB.Query() metode mengambil SQL sebagai string, dan nol atau lebih argumen (seperti halnya Exec() , atau QueryRow() ). String SQL tanpa argumen tambahan akan menanyakan persis apa yang Anda tulis. Namun, asalkan string SQL dengan placeholder dan argumen tambahan, pernyataan yang disiapkan sedang dilakukan untuk Anda di bawah tenda.

DB.Prepare() metode secara eksplisit melakukan pernyataan yang disiapkan, yang kemudian Anda berikan argumen, seperti dalam:stmt.Exec(...args) .

Ada beberapa hal yang perlu dipikirkan, dalam hal perbedaan antara keduanya dan mengapa harus menggunakan satu atau yang lain.

Anda dapat menggunakan DB.Query() tanpa argumen. Ini bisa sangat efisien karena dapat melewati prepare --> execute --> close urutan yang harus dilalui oleh pernyataan yang disiapkan.

Anda juga dapat menggunakannya dengan argumen tambahan, dan placeholder dalam string kueri, dan itu akan mengeksekusi pernyataan yang disiapkan di bawah sampul seperti yang saya sebutkan di atas. Masalah potensial di sini adalah ketika Anda membuat sejumlah kueri, masing-masing menghasilkan pernyataan yang disiapkan secara tersembunyi. Karena ada langkah tambahan yang terlibat, ini bisa jadi agak tidak efisien karena ia mempersiapkan ulang, mengeksekusi, dan menutup setiap kali Anda melakukan kueri itu.

Dengan pernyataan eksplisit yang disiapkan, Anda mungkin dapat menghindari ketidakefisienan itu saat Anda mencoba menggunakan kembali SQL yang telah Anda siapkan sebelumnya, dengan argumen yang berpotensi berbeda.

Tapi itu tidak selalu berjalan seperti yang Anda harapkan... Karena kumpulan koneksi yang mendasari yang dikelola oleh db/sql, "koneksi database" Anda cukup virtual. DB.Prepare() metode akan menyiapkan pernyataan terhadap koneksi tertentu dan kemudian mencoba untuk mendapatkan koneksi yang sama kembali ketika saatnya untuk mengeksekusi, tetapi jika koneksi itu tidak tersedia, itu hanya akan mengambil koneksi yang tersedia dan mempersiapkan kembali dan mengeksekusinya. Jika Anda menggunakan pernyataan siap yang sama berulang-ulang maka Anda mungkin, tanpa sadar, juga mempersiapkannya berulang-ulang. Hal ini jelas terlihat saat Anda menghadapi lalu lintas yang padat.

Jadi, jelas penggunaan Anda untuk situasi apa bergantung pada kasus penggunaan spesifik Anda, tetapi saya harap detail di atas cukup membantu memperjelas bagi Anda sehingga Anda dapat membuat keputusan terbaik dalam setiap kasus.

Perbarui

Mengingat pembaruan di OP pada dasarnya tidak ada perbedaan ketika kueri hanya perlu dilakukan sekali, karena kueri dengan argumen dilakukan sebagai pernyataan yang disiapkan di belakang layar.

Gunakan metode langsung, mis. DB.Query() dan analognya, vs. secara eksplisit menggunakan pernyataan yang disiapkan, karena akan menghasilkan kode sumber yang lebih sederhana.

Karena pernyataan yang disiapkan, dalam hal ini, digunakan untuk alasan keamanan, mungkin ada baiknya upaya untuk menangani masalah keamanan dengan cara lain dan menggunakan kueri plaintext sebagai gantinya, karena akan meningkatkan kinerja. Namun, keuntungan apa pun mungkin tidak relevan kecuali jika ada lalu lintas yang cukup (atau lalu lintas diperkirakan akan tumbuh pesat di masa mendatang) untuk meringankan beban di server. Sekali lagi, ini tergantung pada kasus penggunaan di dunia nyata.

Bagi siapa pun yang tertarik dengan beberapa metrik tentang perbedaan antara pernyataan yang disiapkan dan kueri plaintext langsung, ada artikel bagus di sini (yang juga melakukan pekerjaan yang sangat baik untuk menjelaskan banyak hal di atas).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menjalankan file MySQL *.sql di PHP

  2. Penyedia ADO.NET dengan nama invarian 'MySql.Data.MySqlClient' tidak terdaftar di file konfigurasi mesin atau aplikasi

  3. Peringatan:mysql_connect():Akses ditolak untuk pengguna 'root'@'localhost' (menggunakan kata sandi:YA)

  4. kesalahan mengubah tabel, menambahkan batasan kunci asing mendapatkan kesalahan Tidak dapat menambah atau memperbarui baris anak

  5. Permintaan MySQL, MAX() + GROUP BY