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

MySQL tidak menggunakan indeks dengan klausa WHERE IN?

Lihat Bagaimana MySQL Menggunakan Indeks .

Validasi juga apakah MySQL masih menjalankan pemindaian tabel lengkap setelah Anda menambahkan sekitar 2000 baris tambahan ke user_metrics meja. Dalam tabel kecil, access-by-index sebenarnya lebih mahal (dari segi I/O) daripada pemindaian tabel, dan pengoptimal MySQL mungkin mempertimbangkan hal ini.

Bertentangan dengan postingan saya sebelumnya , ternyata MySQL juga menggunakan pengoptimal berbasis biaya , yang merupakan kabar baik - yaitu, asalkan Anda menjalankan ANALYZE setidaknya sekali ketika Anda yakin bahwa volume data dalam database Anda mewakili penggunaan sehari-hari di masa mendatang.

Saat berhadapan dengan pengoptimal berbasis biaya (Oracle, Postgres, dll.), Anda perlu memastikan untuk menjalankan ANALYZE di berbagai meja Anda karena ukurannya meningkat lebih dari 10-15%. (Postgres akan melakukan ini secara otomatis untuk Anda, secara default, sedangkan RDBMS lain akan menyerahkan tanggung jawab ini kepada DBA, yaitu Anda.) Melalui analisis statistik, ANALYZE akan membantu pengoptimal mendapatkan gagasan yang lebih baik tentang berapa banyak I/O (dan sumber daya terkait lainnya, seperti CPU, yang dibutuhkan, misalnya untuk penyortiran) akan dilibatkan saat memilih di antara berbagai kandidat rencana eksekusi. Gagal menjalankan ANALYZE dapat mengakibatkan keputusan perencanaan yang sangat buruk dan terkadang membawa malapetaka (misalnya pengambilan kueri milidetik, terkadang, berjam-jam karena perulangan bersarang yang buruk di JOIN s.)

Jika kinerja masih tidak memuaskan setelah menjalankan ANALYZE , maka Anda biasanya dapat mengatasi masalah tersebut dengan menggunakan petunjuk, mis. FORCE INDEX , sedangkan dalam kasus lain Anda mungkin menemukan bug MySQL (mis. yang lebih lama , yang bisa menggigit Anda jika Anda menggunakan nested_set Rail Rails ).

Sekarang, karena Anda menggunakan aplikasi Rails , itu akan merepotkan (dan mengalahkan tujuan ActiveRecord ) untuk mengeluarkan kueri khusus Anda dengan petunjuk alih-alih terus menggunakan ActiveRecord -yang dihasilkan.

Saya telah menyebutkannya di aplikasi Rails kami semua SELECT kueri turun di bawah 100 md setelah beralih ke Postgres, sedangkan beberapa gabungan kompleks dihasilkan oleh ActiveRecord terkadang membutuhkan waktu hingga 15 detik atau lebih dengan MySQL 5.1 karena loop bersarang dengan pemindaian tabel bagian dalam, bahkan ketika indeks tersedia. Tidak ada pengoptimal yang sempurna, dan Anda harus mengetahui opsinya. Masalah kinerja potensial lainnya yang harus diperhatikan, selain pengoptimalan rencana kueri, sedang terkunci. Ini di luar cakupan masalah Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 5 Alat GUI MySQL Teratas (Gratis &Berbayar)

  2. Bagaimana cara mendeteksi bahwa transaksi telah dimulai?

  3. Bagaimana cara mengubah zona waktu di MySQL

  4. Penyeimbangan Beban MySQL &MariaDB dengan ProxySQL

  5. Menyimpan prosedur di phpMyAdmin