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

Indeks komposit MySQL dan operator ANTARA

Gayamu sangat tidak biasa.

Kebanyakan orang mungkin akan menulis WHERE began_at < NOW() AND finished_at > NOW()

Namun. Saya akan merekomendasikan menempatkan indeks di kedua bidang.

Kunci gabungan tidak akan berguna bagi Anda karena Anda hanya akan mempercepat pencari untuk kombinasi tanggal tertentu.

Yah ini tidak sepenuhnya benar karena jika Anda menggunakan betree, kunci gabungan akan membantu Anda tetapi tidak sebaik jika Anda mengindeksnya secara terpisah. Kunci gabungan sangat baik jika Anda mencari kombinasi bidang dengan operator kesetaraan (=). Indeks bidang tunggal berkinerja lebih baik dalam permintaan ragen.

Anda dapat mencari di Google sedikit untuk "pencarian rentang multidimensi".

Alasannya adalah bahwa semua bidang yang cocok dalam satu bidang pada dasarnya dapat ditemukan dalam waktu log(n) di btrees. Jadi keseluruhan waktu proses Anda adalah O(k*log(n)) yaitu O(log(n)).

Kueri Rentang Multidimensi memiliki runtime O(sqrt(n)) yang lebih tinggi. Namun ada implementasi yang lebih baik juga yang juga menyebabkan runtime logaritmik. Namun mereka tidak sepenuhnya diimplementasikan di mysql, sehingga akan lebih buruk atau buruk tergantung pada versinya.

Jadi saya simpulkan:

  • Perbandingan kesetaraan pada bidang tunggal:indeks hash (runtime O(1))

  • Pencarian rentang pada bidang tunggal:indeks btree pada bidang tunggal ( O(log(n)) )

  • Pencarian kesetaraan di beberapa bidang:kunci hash gabungan (runtime O(1))

kasus-kasus itu adalah hal yang jelas...

  • Rentang pencarian di beberapa bidang:indeks btree terpisah ( O(log(n)) )

ini adalah di mana yang tidak begitu jelas. dengan versi saat ini jelas lebih baik untuk mengindeks secara terpisah karena alasan yang diberikan di atas. Dengan implementasi yang sempurna untuk kasus penggunaan itu, Anda dapat mencapai kinerja yang lebih baik dengan kunci gabungan tetapi tidak ada sistem yang diketahui mendukungnya. mysql mendukung indeks longgar (yang Anda perlu untuk itu) sejak versi 5.0, tetapi hanya sangat terbatas dan pengoptimal kueri hanya menggunakannya dalam kasus yang jarang terjadi afaik. tidak tahu tentang versi yang lebih baru seperti 5.3 atau semacamnya.

namun dengan mysql yang mengimplementasikan indeks longgar, kunci gabungan pada bidang tempat Anda melakukan berbagai permintaan atau menyortir ke arah yang berbeda menjadi semakin relevan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gagal mengonversi dari tipe [java.lang.Object[]] menjadi tipe [@org.springframework.data.jpa.repository.Query

  2. Menggunakan filesort untuk mengurutkan berdasarkan kolom datetime di MySQL

  3. Ambil baris stempel waktu terbaru dari tabel menggunakan INNER JOIN

  4. Memasukkan catatan dengan kunci utama autoincrementing

  5. MySQL group_concat() memesan berdasarkan nilai pernyataan kasus