Saya tidak mendapatkan ini.
Saya punya tabel dengan indeks ini
PRIMARY post_id
INDEX topic_id
FULLTEXT post_text
Tabel memiliki (hanya) 346.000 baris. Saya mencoba melakukan 2 pertanyaan.
SELECT post_id
FROM phpbb_posts
WHERE topic_id = 144017
AND post_id != 155352
AND MATCH(post_text) AGAINST('http://rapidshare.com/files/5494794/photo.rar')
membutuhkan waktu 4,05 detik
SELECT post_id
FROM phpbb_posts
WHERE topic_id=144017
AND post_id != 155352
AND post_text LIKE ('%http://rapidshare.com/files/5494794/photo.rar%')
membutuhkan waktu 0,027 detik.
EXPLAIN menunjukkan bahwa satu-satunya perbedaan adalah dalam kemungkinan_kunci ( fulltext
sudah termasuk post_text, LIKE
tidak)
Itu sangat aneh.
Ada apa di balik ini? Apa yang terjadi di latar belakang? Bagaimana bisa LIKE
begitu cepat ketika tidak menggunakan indeks dan FULLTEXT sangat lambat saat menggunakan indeksnya?
UPDATE1:
Sebenarnya sekarang ini membutuhkan waktu sekitar 0,5 detik, mungkin meja dikunci, tetapi tetap saja, ketika saya menghidupkan profil, ini menunjukkan bahwa INISIIALISASI FULLTEXT memerlukan waktu 0,2 detik. Ada apa?
Saya dapat meminta tabel saya dengan LIKE
10x per detik, dengan teks lengkap hanya 2x
UPDATE2:
Mengherankan!
mysql> SELECT post_id FROM phpbb_posts WHERE post_id != 2 AND topic_id = 6 AND MATCH(post_text) AGAINST ('rapidshare.com');
Empty set (0.04 sec)
jadi saya bertanya, bagaimana ini mungkin?
Selain itu,
SELECT count(*) FROM phpbb_posts WHERE MATCH(post_text) AGAINST ('rapidshare.com')
sangat lambat. Bisakah teks lengkap rusak?
UPDATE3:
Apa apaan?
SELECT forum_id, post_id, topic_id, post_text FROM phpbb_posts WHERE MATCH(post_text) AGAINST ('rapidshare.com') LIMIT 0, 30;
Dibutuhkan waktu 0,27 detik
SELECT count(*) FROM phpbb_posts WHERE MATCH(post_text) AGAINST ('rapidshare.com') LIMIT 0, 30;
membutuhkan waktu lebih dari 30 detik! Apa yang salah di sini?
sumber
Jawaban:
Saya pikir masalahnya mungkin berasal dari keberadaan indeks FULLTEXT itu sendiri.
Setiap kali ada kueri yang melibatkan indeks FULLTEXT, Pengoptimal Kueri MySQL cenderung mendorong kueri ke dalam pemindaian tabel penuh. Saya telah melihat ini selama bertahun-tahun. Saya juga menulis posting sebelumnya tentang perilaku paling sepele ini dalam indeks FULLTEXT .
Anda mungkin perlu melakukan dua hal:
REFACTOR QUERY THE
Ini pertanyaan asli Anda
Anda harus memperbarui permintaan seperti ini:
BUAT INDEKS BARU
Anda akan memerlukan indeks untuk mendukung
subqueryA
. Anda sudah memiliki indekstopic_id
. Anda perlu menggantinya sebagai berikut:Cobalah !!!
UPDATE 2012-03-19 13:08 EDT
Coba yang ini dulu
Jika ini berjalan cepat dan mengembalikan sejumlah kecil baris, cobalah subquery bersarang ini:
UPDATE 2012-03-19 13:11 EDT
Bandingkan waktu berjalan ini:
dengan ini
Jika ada waktu berjalan yang sama, maka klausa MATCH dieksekusi pada setiap baris. Seperti yang saya sebutkan sebelumnya, menggunakan indeks FULLTEXT cenderung membatalkan manfaat apa pun yang dicoba dan dikontribusikan oleh Pengoptimal Permintaan MySQL.
sumber
post_id
membingungkannya? Mengapa kueri LIKE berfungsi bahkan tanpa indeks pada kolom ini (topic_id, post_id)? Mengapa MYSQL tidak hanya memilih dengan cerdastopic_id = 144017 AND post_id != 155352
dan kemudian hanya menelusuri melalui hasil ini? Dan bagaimana jika 100k baris menyertakan string pencarian teks lengkap sayapost_text
? Bukankah itu akan memilih semuanya?