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

mysql:sangat sederhana SELECT id ORDER BY LIMIT tidak akan menggunakan INDEX seperti yang diharapkan (?!)

Pencarian indeks berdasarkan nilai , bukan berdasarkan posisi . Indeks dapat mencari nilai 2955900, tetapi Anda tidak memintanya. Anda meminta kueri untuk memulai dengan offset baris ke-2955900 dalam tabel.

Pengoptimal tidak dapat berasumsi bahwa semua nilai kunci utama berurutan. Jadi kemungkinan besar baris ke-2955900 memiliki nilai yang jauh lebih tinggi dari itu.

Meskipun nilai kunci utama berurutan, Anda mungkin memiliki kondisi WHERE yang hanya cocok, misalnya, 45% dari baris. Dalam hal ini, nilai id pada baris ke-2955900 adalah jalan melewati nilai id 2955900.

Dengan kata lain, pencarian indeks dari nilai id 2955900 tidak akan menghasilkan baris ke-2955900.

Jadi MySQL tidak dapat menggunakan indeks untuk offset batas. Itu harus pindai baris untuk menghitungnya hingga mencapai offset+limit baris.

MySQL memang memiliki pengoptimalan yang terkait dengan LIMIT , tetapi ini lebih tentang menghentikan pemindaian tabel setelah mencapai jumlah baris yang akan dikembalikan. Pengoptimal mungkin masih melaporkan dalam rencana EXPLAIN yang diharapkan mungkin harus memindai seluruh tabel.

Kesalahpahaman yang sering terjadi tentang FORCE INDEX adalah bahwa itu memaksa penggunaan indeks. :-)Bahkan, jika kueri tidak bisa gunakan indeks (atau jika indeks yang tersedia tidak memiliki manfaat apa pun untuk kueri ini), FORCE INDEX tidak berpengaruh.

Kembali komentar Anda:

Pagination adalah kutukan yang sering terjadi pada aplikasi web berbasis data. Terlepas dari seberapa umum fitur ini, tidak mudah untuk mengoptimalkannya. Berikut beberapa kiatnya:

  • Mengapa Anda menanyakan dengan offset 2955900? Apakah Anda benar-benar mengharapkan pengguna untuk menyaring halaman sebanyak itu? Sebagian besar pengguna menyerah setelah beberapa halaman (persisnya berapa banyak tergantung pada jenis aplikasi dan data).

  • Kurangi jumlah kueri. Fungsi pagination Anda dapat mengambil 5-10 halaman pertama, meskipun hanya menampilkan halaman pertama kepada pengguna. Cache halaman lain, dengan asumsi bahwa pengguna akan maju melalui beberapa halaman. Hanya jika mereka maju melewati kumpulan halaman yang di-cache, aplikasi Anda harus melakukan kueri lain. Anda bahkan dapat men-cache semua 10 halaman dalam Javascript di browser klien sehingga mengklik "Berikutnya" seketika untuk mereka (setidaknya untuk beberapa halaman pertama).

  • Jangan meletakkan tombol "Terakhir" pada antarmuka pengguna mana pun, karena orang akan mengkliknya karena penasaran. Perhatikan Google memiliki tombol "Berikutnya" tetapi bukan tombol "Terakhir". Jadi UI itu sendiri mencegah orang menjalankan kueri yang tidak efisien dengan offset tinggi.

  • Jika pengguna memajukan satu halaman pada satu waktu, gunakan nilai id tertinggi yang dikembalikan di halaman sebelumnya dalam klausa WHERE dari kueri halaman berikutnya. Yaitu. berikut melakukan gunakan indeks, bahkan tanpa petunjuk FORCE INDEX:

    SELECT * FROM thistable WHERE id > 544 LIMIT 20
    



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Escape string untuk digunakan dalam pencarian teks lengkap MySQL

  2. MySQL. Pesan lokasi dan gabung daftar secara acak

  3. Pencarian Teks Lengkap di MySQL:Yang Baik, yang Buruk dan yang Jelek

  4. Bagaimana cara menyisipkan gambar di database mysql (tabel)?

  5. Chart.js v2.6:Tambahkan panah ke nilai output diagram lingkaran