【发布时间】:2010-10-14 16:18:20
【问题描述】:
作为this question 的更一般情况,因为我认为更多人可能会对它感兴趣...在两个表上执行全文搜索的最佳方法是什么?假设有三张表,一张用于程序(带有submitter_id),一张用于标签和描述,带有object_id:外键引用程序中的记录。我们想要在标签或描述中包含特定文本的程序的 submitter_id。我们必须使用 MATCH AGAINST 原因我不会在这里讨论。不要纠结于这方面。
programs
id
submitter_id
tags_programs
object_id
text
descriptions_programs
object_id
text
以下工作并在 20 毫秒左右的时间内执行:
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'))
但我尝试将其重写为 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'))
出于好奇,我将 OR 替换为 AND。这也可以在几毫秒内运行,但这不是我需要的。上面的第二个查询有什么问题?我可以使用 UNION 和子选择,但我想了解。
【问题讨论】: