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

Menggabungkan indeks FULLTEXT di MySQL

Jawaban @Alden Quimby benar sejauh ini, tetapi ada lebih banyak cerita, karena MySQL hanya akan mencoba untuk memilih indeks yang optimal, dan kemampuannya untuk menentukan itu terbatas karena cara indeks teks lengkap berinteraksi dengan pengoptimal.

Yang sebenarnya terjadi adalah ini:

Jika user_id yang ditentukan ada di 0 atau 1 baris yang cocok dalam tabel, pengoptimal akan menyadari hal ini dan akan memilih user_id sebagai indeks untuk kueri tersebut. Eksekusi cepat.

Jika tidak, pengoptimal akan memilih indeks teks lengkap, memfilter setiap baris yang cocok dengan indeks teks lengkap untuk menghilangkan baris yang tidak berisi user_id yang cocok dengan klausa WHERE. Tidak secepat itu.

Jadi itu bukan jalur "optimal". Ini lebih seperti teks lengkap, dengan optimasi yang bagus untuk menghindari pencarian teks lengkap di bawah satu syarat bahwa kita tahu kita hampir tidak tertarik pada tabel.

Alasan rusaknya ini adalah karena indeks teks lengkap tidak memberikan statistik yang berarti kembali ke pengoptimal. Itu hanya mengatakan "ya, saya pikir kueri itu mungkin hanya mengharuskan saya untuk memeriksa 1 baris" ... yang, tentu saja, sangat menyenangkan pengoptimal, sehingga indeks teks lengkap memenangkan tawaran untuk biaya terendah, kecuali indeks dengan bilangan bulat nilainya juga sangat rendah atau lebih rendah.

Meski begitu, bukan berarti saya tidak akan mencobanya terlebih dahulu.

Ada opsi lain, yang akan bekerja paling baik dengan kueri teks lengkap IN BOOLEAN MODE dan itu untuk membuat kolom lain yang akan Anda isi dengan sesuatu seperti CONCAT('user_id_',user_id) atau yang serupa, dan kemudian mendeklarasikan indeks teks lengkap 2 kolom.

filter_string VARCHAR(48) # populated with CONCAT('user_id_',user_id);
....
FULLTEXT KEY (message,filter_string)

Kemudian tentukan semuanya dalam kueri.

SELECT ...
 WHERE user_id = 500 AND
 MATCH (message,filter_string) AGAINST ('+kittens +puppies +user_id_500' IN BOOLEAN MODE);

Sekarang, indeks teks lengkap akan bertanggung jawab untuk mencocokkan hanya baris di mana anak kucing, anak anjing, dan "user_id_500" muncul di indeks teks lengkap gabungan dari dua kolom, tetapi Anda masih ingin memiliki filter bilangan bulat di sana juga untuk memastikan hasil akhir dibatasi meskipun ada tampilan acak "user_id_500" dalam pesan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membuat bidang NULL menggunakan Alat GUI MySQL?

  2. MySQL:Perbarui/masukkan/hapus kueri yang sangat lambat tergantung pada langkah akhir kueri

  3. MySQL memilih baris di mana tanggal bukan di antara tanggal

  4. Gabungkan bidang dari baris yang berbeda dengan syarat

  5. MySQL – Pulihkan Basis Data Skema Kinerja yang Dijatuhkan