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

Optimalkan PILIH ... DI MANA DI (...)

SELECT * FROM  products                         <<-- select * is non-optimal
WHERE  prodid in (10331,11639,12127..) 
ORDER BY Field(prodid, 10331,11639,12127...);   <<-- your problem is here

Pertama-tama letakkan indeks di prodid lihat jawaban @ Anthony.

Daripada mengubah kueri untuk membaca:

SELECT only,the,fields,you,need FROM  products
WHERE  prodid in (10331,11639,12127..) 
ORDER BY prodid

Jika Anda memastikan IN list diurutkan naik sebelum menawarkannya ke IN klausa, order by prodid akan menghasilkan hasil yang sama als order by field(...

  • Menggunakan fungsi alih-alih bidang menghilangkan peluang penggunaan indeks, menyebabkan kelambatan.
  • select * akan mengambil data yang mungkin tidak Anda perlukan, menyebabkan akses disk ekstra, dan penggunaan memori ekstra dan lalu lintas jaringan ekstra.
  • Di InnoDB, jika Anda hanya select bidang yang diindeks, MySQL tidak akan pernah membaca tabel, tetapi hanya indeks yang menghemat waktu (dalam kasus Anda ini mungkin bukan masalah)

Ada beberapa trik yang bisa Anda gunakan.

  • Jika tabel produk tidak terlalu besar, Anda bisa menjadikannya sebagai memory tabel, yang disimpan dalam RAM. Jangan lakukan ini untuk tabel besar, ini akan memperlambat hal lain.
    Anda hanya dapat menggunakan hash indeks pada tabel memori.
  • Jika prodidnya kontinu, Anda dapat menggunakan BETWEEN 1000 AND 1019 bukannya
    IN (1000, 1001 ..., 1019)


  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 cara kerja indeks MySQL?

  2. Joomla:Panggil fungsi pembantu dari dalam model?

  3. Mysql Like + Wild Card vs Operator Setara

  4. MySQL ORDER BY [nilai bidang SET kustom]

  5. Hapus data di tabel MySQL dengan PHP?