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

MySQL PDO disiapkan lebih cepat dari kueri? Itulah yang ditunjukkan oleh tes sederhana ini

Ada satu hal kecil untuk disebutkan. Secara default, PDO hanya meniru pernyataan yang telah disiapkan.
Dan saat dalam mode emulasi, ia menjalankan kueri lama yang sama tanpa benar-benar menyiapkan satu pernyataan :)

Jadi, pertama-tama,

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

untuk mengaktifkan pernyataan yang sudah disiapkan.

Ada hal kecil lain yang perlu disebutkan.
Sayangnya, hanya sedikit yang nyata pengetahuan di dunia. Dan terutama di dunia situs Q&A. Orang cenderung mengulangi informasi yang telah mereka baca dan dianggap masuk akal. Tanpa menjalankan tes apa pun untuk membuktikan atau bahkan tanpa meletakkan tangan mereka. Jadi, "sering dicatat" tidak boleh dianggap sebagai sumber yang dapat dipercaya sama sekali.

Kembali ke masalah:meskipun harus ada beberapa penalti, sebagian besar waktu seharusnya tidak signifikan. Jika ya - Anda harus menyetel sistem Anda.

Bagaimanapun, dalam mode emulasi Anda mendapatkannya "cepat" dan aman.

Perbarui
Nah, setelah menjalankan pengujian Anda pada data saya, saya harus mengatakan bahwa ada yang salah dengan database Anda jika Anda memiliki perbedaan 3 kali pada kumpulan data yang besar.

Untuk pertanyaan kilat

select title from Board where id = 1

hasilnya adalah

emulation   on      off
query      0.07    0.130
prepare    0.075   0.145

sedangkan untuk query yang cukup memberatkan

select title from Board where id > 1

hasilnya adalah

emulation   on      off
query      0.96    0.96
prepare    0.96    1.00

Jadi, seperti yang bisa kita lihat, pada kumpulan data yang besar perbedaannya tidak terlalu mencolok.

Untuk kueri kilat ada beberapa perbedaan, tetapi, karena hanya membutuhkan waktu 0,0003 detik (untuk satu kueri) - menurut saya itu adalah contoh sempurna untuk kata "ketidakpedulian".

Untuk hasil yang sama antara query()/prepare() - Saya hanya punya satu ide - PDO menggunakan persiapan/eksekusi untuk semua kueri, bahkan kueri tanpa ikatan.

Sekarang ke masalah penyandian.

Ya, masalah GBK yang aneh memang memengaruhi PDO untuk versi sebelumnya 5.3.3. Versi ini tidak memiliki cara untuk mengatur penyandian yang tepat dan tidak dapat dihindari rentan (dalam mode emulasi). Tetapi sejak 5.3.3 PDO mendukung pengaturan encoding di DSN, dan sekarang semuanya baik-baik saja dengan itu.
Untuk mysqli kita harus menggunakan mysqli_set_charset() untuk tujuan ini dengan hasil yang sama (tidak dapat ditembus).

Di kelas saya sendiri yang didasarkan pada mysqli, saya menggunakan implementasi placeholder saya sendiri dan tidak menggunakan pernyataan yang disiapkan sama sekali. Bukan karena alasan kinerja tetapi untuk keandalan yang lebih baik.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa waktu unix MySQL berhenti dari batas integer 32 bit yang tidak ditandatangani?

  2. Pernyataan KASUS SQL

  3. Javascript PHP? Lakukan sesuatu saat pengguna menutup halaman atau browser

  4. 1030 Mendapat kesalahan 28 dari mesin penyimpanan

  5. Apa yang dimaksud dengan kesalahan mysql 1025 (HY000):Kesalahan saat mengganti nama './foo' (errorno:150)?