このクエリを使用して、MySQLデータベースで全文検索を実行しています。
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
結果は非常に関連性がありますが、検索は非常に遅く、テーブルが大きくなるにつれてますます遅くなっています。
テーブル統計:
質問-400レコード
インデックス
- プライマリBTREE-id
- BTREE-uniquecode
- BTREE-質問日
- BTREE-ユーザーID
- フルテキスト-質問テキスト
- フルテキスト-uniquecode
回答-3,635レコード
インデックス
- PRIMARY-BTREE-id
- BTREE-回答日
- BTREE-questionid
- フルテキスト-アンサーテキスト
answer_mapping -4,228レコード
インデックス
- PRIMARY-BTREE-id
- BTREE-answerid
- BTREE-questionid
- BTREE-ユーザーID
タグ-1,847レコード
インデックス
- PRIMARY-BTREE-id
- BTREE-タグ
- フルテキスト-タグ
タグマッピング-3,389レコード
インデックス
- PRIMARY-BTREE-id
- BTREE-tagid
- BTREE-questionid
なんらかの理由でタグマッピングとタグを削除すると、検索が大幅に高速化されます。
このクエリを高速化するためのヒントはありますか?
前もって感謝します!