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

Mengapa MySQL lambat saat menggunakan LIMIT dalam kueri saya?

Indeks tidak serta merta meningkatkan kinerja. Untuk lebih memahami apa yang terjadi, akan membantu jika Anda menyertakan explain untuk kueri yang berbeda.

Tebakan terbaik saya adalah Anda memiliki indeks di id_state atau bahkan id_state, id_mp yang dapat digunakan untuk memenuhi where ayat. Jika demikian, kueri pertama tanpa order by akan menggunakan indeks ini. Seharusnya cukup cepat. Bahkan tanpa indeks, ini memerlukan pemindaian berurutan halaman dalam orders tabel, yang masih cukup cepat.

Kemudian ketika Anda menambahkan indeks pada creation_date , MySQL memutuskan untuk menggunakan indeks itu sebagai gantinya untuk order by . Ini membutuhkan membaca setiap baris dalam indeks, kemudian mengambil halaman data yang sesuai untuk memeriksa where kondisi dan kembalikan kolom (jika ada kecocokan). Pembacaan ini sangat tidak efisien, karena tidak dalam urutan "halaman" melainkan seperti yang ditentukan oleh indeks. Pembacaan acak bisa sangat tidak efisien.

Lebih buruk lagi, meskipun Anda memiliki limit , Anda masih harus membaca seluruhnya tabel karena seluruh set hasil diperlukan. Meskipun Anda telah menyimpan pengurutan pada 38 catatan, Anda telah membuat kueri yang sangat tidak efisien.

Omong-omong, situasi ini menjadi jauh lebih buruk jika orders tabel tidak sesuai dengan memori yang tersedia. Kemudian Anda memiliki kondisi yang disebut "thrashing", di mana setiap record baru cenderung menghasilkan pembacaan I/O baru. Jadi, jika sebuah halaman memiliki 100 record, halaman tersebut mungkin harus dibaca 100 kali.

Anda dapat membuat semua kueri ini berjalan lebih cepat dengan memiliki indeks pada orders(id_state, id_mp, creation_date) . where klausa akan menggunakan dua kolom pertama dan order by akan menggunakan yang terakhir.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan MariaDB

  2. Tampilkan semua kunci saat ini dari get_lock

  3. Menu rekursi hierarkis dengan PHP/MySQL

  4. Tidak dapat terhubung ke MySQL - Glassfish dan Hibernate

  5. Kesalahan 1215:Tidak dapat menambahkan batasan kunci asing