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

MySQL menggunakan indeks yang berbeda tergantung pada nilai batas dengan permintaan ORDER BY

Begitulah caranya. Bersabarlah sebentar...

Pengoptimal ingin menggunakan INDEX, dalam hal ini ACTI_DATE_I. Tapi itu tidak ingin menggunakannya jika itu akan lebih lambat.

Paket A:Gunakan indeks.

  1. Mencapai indeks terstruktur BTree di bagian akhir (karena DESC)
  2. Pindai mundur
  3. Untuk setiap baris dalam indeks, cari baris yang sesuai dalam data. Catatan:Indeks memiliki (ACTIVITY_DATE, ACTIVITY_ID) karena PRIMARY KEY secara implisit ditambahkan ke secondary key mana pun. Untuk menjangkau "data" menggunakan PK (ACTIVITY_ID) adalah pencarian BTree lainnya, berpotensi acak. Oleh karena itu, berpotensi lambat. (Tapi tidak terlalu lambat dalam kasus Anda.)
  4. Ini berhenti setelah LIMIT baris.

Paket B:Abaikan tabel

  1. Pindai tabel, buat tabel tmp. (Kemungkinan ada dalam ingatan.)
  2. Urutkan tabel tmp
  3. Kupas LIMIT baris.

Dalam kasus Anda (96 -- 1% dari 10K) mengejutkan bahwa ia memilih pemindaian tabel. Biasanya, batasnya sekitar 10% -30% dari jumlah baris dalam tabel.

ANALYZE TABLE harus telah menyebabkan penghitungan ulang statistik, yang bisa telah meyakinkannya untuk mengikuti Rencana lainnya.

Versi MySQL apa yang Anda gunakan? (Tidak, saya tidak tahu ada perubahan di area ini.)

Satu hal yang dapat Anda coba:OPTIMIZE TABLE ACTIVITIES; Itu akan membangun kembali tabel, sehingga mengemas ulang blok dan mengarah ke berpotensi statistik yang berbeda. Jika itu membantu, saya ingin mengetahuinya -- karena saya biasanya mengatakan "Mengoptimalkan tabel tidak berguna".




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konektor MySQL ODBC odbc.ini nilai bendera 'Opsi'

  2. Pengantar Database Ketersediaan Tinggi untuk MySQL &MariaDB

  3. Bagaimana saya bisa terhubung ke database yang berbeda selama runtime aplikasi dengan Laravel?

  4. Penghitung kenaikan MySQL SELECT

  5. Tempat menyimpan kredensial basis data dengan aman di dalam situs web PHP