Saya sedang mengerjakan kueri dan ingin membuatnya lebih efisien jika memungkinkan.

Tabelnya seperti:

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(200),
    FULLTEXT (title)
) Engine=MyISAM;

Permintaan yang harus efisien:

SELECT * FROM articles 
WHERE 
MATCH (title)
  AGAINST ('+MySQL' IN BOOLEAN MODE)
  AND title <> 'MySQL';

Saya punya 2 pertanyaan tentang permintaan di atas:

  1. Apakah AND title <> 'MySQL' menggunakan indeks teks lengkap?
  2. Bisakah kita membuatnya lebih efisien?

Anda dapat menemukan biola di sini http://www.sqlfiddle.com/#! 9/268411/2/0

1
Syed 18 Juni 2020, 07:35

1 menjawab

Jawaban Terbaik

Apakah AND title <> 'MySQL' menggunakan indeks teks lengkap?

Tidak.

Istilah pertama, MATCH...AGAINST akan menggunakan indeks teks lengkap, dan hanya memilih baris tempat kata muncul di judul. Itu akan menyebabkan kueri hanya memeriksa baris yang cocok.

Kemudian, memeriksa baris-baris tersebut, istilah kedua akan menyaring lebih lanjut untuk baris-baris yang judulnya lebih dari sekadar satu kata 'MySQL'. Judul akan tetap mengandung 'MySQL' tetapi harus memiliki kata lain juga (atau setidaknya beberapa karakter lain).

Bisakah kita membuatnya lebih efisien?

Tidak dengan MySQL.

Saya percaya pengoptimal akan memilih untuk menggunakan indeks teks lengkap untuk pencarian MATCH...AGAINST, atau akan menggunakan indeks pohon-B untuk jenis predikat lain, tetapi tidak keduanya.

Jika Anda ingin lebih efisien, Anda harus mengindeks data dengan beberapa mesin pencari lain, mis. ElasticSearch atau Pencarian Sphinx.

0
Bill Karwin 18 Juni 2020, 04:54