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

Kecepatan kata kunci IN di MySQL/PostgreSQL

Di PostgreSQL, persisnya apa yang akan Anda dapatkan di sini bergantung pada tabel yang mendasarinya, jadi Anda harus menggunakan EXPLAIN ANALYZE pada beberapa kueri sampel terhadap subset data yang berguna untuk mengetahui dengan tepat apa yang akan dilakukan pengoptimal (pastikan tabel Anda 'berlawanan telah DIANALISIS juga). IN dapat diproses dengan beberapa cara berbeda, dan itulah mengapa Anda perlu melihat beberapa sampel untuk mengetahui alternatif mana yang digunakan untuk data Anda. Tidak ada jawaban umum yang sederhana untuk pertanyaan Anda.

Adapun pertanyaan spesifik yang Anda tambahkan dalam revisi Anda, terhadap kumpulan data sepele tanpa indeks yang terlibat, inilah contoh dari dua rencana kueri yang akan Anda dapatkan:

postgres=# explain analyze select * from x where s in ('123','456');
 Seq Scan on x  (cost=0.00..84994.69 rows=263271 width=181) (actual time=0.015..1819.702 rows=247823 loops=1)
   Filter: (s = ANY ('{123,456}'::bpchar[]))
 Total runtime: 1931.370 ms

postgres=# explain analyze select * from x where s='123' or s='456';
 Seq Scan on x  (cost=0.00..90163.62 rows=263271 width=181) (actual time=0.014..1835.944 rows=247823 loops=1)
   Filter: ((s = '123'::bpchar) OR (s = '456'::bpchar))
 Total runtime: 1949.478 ms

Kedua runtime tersebut pada dasarnya identik, karena waktu pemrosesan yang sebenarnya didominasi oleh pemindaian sekuensial di seluruh tabel; berjalan beberapa kali menunjukkan perbedaan antara keduanya di bawah run to run margin of error. Seperti yang Anda lihat, PostgreSQL mengubah kasus IN menjadi menggunakan filter APAPUN, yang harus selalu dijalankan lebih cepat daripada serangkaian OR. Sekali lagi, kasus sepele ini belum tentu mewakili apa yang akan Anda lihat pada kueri serius yang melibatkan indeks dan sejenisnya. Bagaimanapun, mengganti IN secara manual dengan serangkaian pernyataan OR seharusnya tidak pernah lebih cepat, karena pengoptimal mengetahui hal terbaik yang harus dilakukan di sini jika memiliki data yang baik untuk digunakan.

Secara umum, PostgreSQL mengetahui lebih banyak trik tentang cara mengoptimalkan kueri yang rumit daripada pengoptimal MySQL, tetapi PostgreSQL juga sangat bergantung pada Anda yang telah memberikan cukup data kepada pengoptimal untuk digunakan. Tautan pertama di bagian "Pengoptimalan Kinerja" dari wiki PostgreSQL mencakup hal terpenting yang diperlukan untuk mendapatkan hasil yang baik dari pengoptimal.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MASUKKAN beberapa entri dari Android -> PHP -> MYSQL

  2. apakah lebih cepat menyisipkan baris dalam urutan kunci utama?

  3. Menggunakan pemicu MySQL untuk mencatat semua perubahan tabel ke tabel sekunder

  4. Enkripsi kata sandi sederhana - bagaimana caranya?

  5. Fungsi PHP untuk keluar dari sintaks regexp MySQL