作为这个问题的更一般情况,因为我认为它可能会引起更多人的兴趣...在两个表上执行全文搜索的最佳方法是什么?假设有三个表,一个用于程序(带有submitter_id),另一个用于带有object_id的标签和描述:外键引用程序中的记录.我们希望程序的submitter_id在其标签或描述中包含某些文本.我们必须使用MATCH AGAINST,因为我不会在这里讨论.不要挂在这方面.
programs
id
submitter_id
tags_programs
object_id
text
descriptions_programs
object_id
text
Run Code Online (Sandbox Code Playgroud)
以下工作并在20ms左右执行:
SELECT p.submitter_id
FROM programs p
WHERE p.id IN
(SELECT t.object_id
FROM titles_programs t
WHERE MATCH (t.text) AGAINST ('china')
UNION ALL
SELECT d.object_id
FROM descriptions_programs d
WHERE MATCH (d.text) AGAINST ('china'))
Run Code Online (Sandbox Code Playgroud)
但我尝试将此作为JOIN重写如下,并且它运行了很长时间.我必须在60秒后杀死它.
SELECT p.id
FROM descriptions_programs d, tags_programs t, programs p
WHERE (d.object_id=p.id AND MATCH (d.text) AGAINST ('china'))
OR (t.object_id=p.id AND MATCH (t.text) AGAINST ('china'))
Run Code Online (Sandbox Code Playgroud)
出于好奇,我用AND取代了OR.这也在几毫秒内运行,但这不是我需要的.上面的第二个查询出了什么问题?我可以和UNION和子选择一起生活,但我想了解.