Ben bir MySQL veritabanı üzerinde tam metin araması gerçekleştirmek için bu sorguyu kullanıyorum:
SELECT DISTINCT
questions.id,
questions.uniquecode,
questions.spam,
questions.questiondate,
questions.userid,
questions.description,
users.login AS username,
questions.questiontext,
questions.totalvotes,
MATCH(questions.questiontext, questions.uniquecode)
AGAINST ('rock guitarist chick*' IN BOOLEAN MODE) AS relevance
FROM questions
LEFT JOIN users ON questions.userid = users.id
LEFT JOIN answer_mapping ON questions.id = answer_mapping.questionid
LEFT JOIN answers ON answer_mapping.answerid = answers.id
LEFT JOIN tagmapping ON questions.id = tagmapping.questionid
LEFT JOIN tags ON tagmapping.tagid = tags.id
WHERE questions.spam < 10
AND
(
MATCH(questions.questiontext, questions.uniquecode)
AGAINST ('rock guitarist chick*' IN BOOLEAN MODE)
OR MATCH(answers.answertext) AGAINST ('rock guitarist chick*' IN BOOLEAN MODE)
OR MATCH (tags.tag) AGAINST ('rock guitarist chick*' IN BOOLEAN MODE)
) GROUP BY questions.id ORDER BY relevance DESC
Sonuçlar çok alakalı, ancak arama gerçekten yavaş ve tablolar büyüdükçe ve yavaş yavaş oluyor.
Tablo istatistikleri:
questions - 400 kayıtlar
indexes
- İLKÖĞRETİM btree - id
- Btree - uniquecode
- Btree - questiondate
- Btree - Userid
- FULLTEXT - questiontext
- FULLTEXT - uniquecode
answers - 3,635 kayıtları
indexes
- PRİMER - btree - id
- Btree - answerdate
- Btree - QuestionID
- FULLTEXT - answertext
answer_mapping - 4228 kayıtları
indexes
- PRİMER - btree - id
- Btree - answerid
- Btree - QuestionID
- Btree - Userid
tags - 1847 kayıtları
indexes
- PRİMER - btree - id
- Btree - tag
- FULLTEXT - tag
tagmapping - 3389 kayıtları
indexes
- PRİMER - btree - id
- Btree - tagid
- Btree - QuestionID
Ben tagmapping kaldırmak ve tags KATILDI zaman ne sebeple olursa olsun arama ölçüde hızlandırır.
Bu sorgu hızlandırmak konusunda herhangi bir ipucu var mı?
Şimdiden teşekkürler!