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

Mengapa Indeks hanya digunakan ketika dipaksa tetapi tidak secara default?

untuk kinerja yang lebih baik, Anda dapat mencoba menggunakan indeks komposit .. berdasarkan kolom yang terlibat dalam klausa where Anda
dan mencoba mengubah klausa IN dalam gabungan bagian dalam
dengan asumsi konten klausa IN Anda adalah kumpulan nilai tetap anda bisa menggunakan union (atau tabel baru dengan nilai yang anda butuhkan )

misalnya menggunakan gabungan (Anda dapat melakukan hal serupa jika klausa IN adalah subquery)

select user_table.colA ,ColB , count(*) as count 
from user_table 
INNER JOIN  ( 
  select 'FIXED1' colA
  union
  select 'FIXED2'
  ....
  union 
  select 'FIXEDX'
  )  t on t.colA = user_table.colA  
where colC >='2019-09-01 00:00:00' 
      and ColB = 17  
group by colA ,ColB;

anda juga dapat menambahkan indeks komposit pada tabel user_table pada kolom

   colA, colB, colC

untuk apa yang terkait dengan elemen yang digunakan oleh pengoptimal kueri mysql untuk memutuskan indeks yang akan digunakan di sana beberapa aspek dan untuk semua ini pengoptimal kueri menetapkan biaya
apa pun yang harus Anda pertimbangkan

  • kolom yang terlibat dalam klausa Where
  • Ukuran tabel (dan bukan ukuran tabel yang di gabung)
  • Perkiraan berapa banyak baris yang akan diambil ( untuk memutuskan apakah akan menggunakan indeks, atau hanya memindai tabel )
  • jika tipe data cocok atau tidak antara kolom dalam jion dan klausa where
  • Penggunaan fungsi atau konversi tipe data termasuk ketidaksesuaian susunan
  • Ukuran indeks
  • kardinalitas indeks

dan untuk semua opsi ini dievaluasi biaya dan ini mengarah ke indeks pilih

Dalam kasus Anda colC sebagai tanggal dapat menyiratkan konversi data (menghormati nilai literal sebagai string ) dan untuk ini indeks tidak dipilih ..

Juga untuk ini saya telah menyarankan indeks komposit dengan kolom paling kiri terkait dengan nilai yang tidak dikonversi



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Permintaan SQL untuk mendapatkan daftar perjanjian

  2. Akses mySQL Database Java ditolak

  3. MySQL GROUP &COUNT Beberapa tabel

  4. Periksa dua tanggal bukan di antara dua tanggal lain + MYSQl

  5. Anotasi JPA @Ukuran untuk BigDecimal