我试图创建一个SELECT查询,通过LEFT JOIN
组合3个表,然后MATCH
特定关键字AGAINST
结果表。
到目前为止,我的测试表明查询工作正常,输出结果是正确的,但是,当通过LEFT JOIN
连接表时,我对FULLTEXT索引有疑问。
问题是-我是否应该添加额外的代码来反映LEFT JOIN
时MATCH AGAINST
的FULLTEXT
索引要求,或者只正确索引原始表中的相关列就足够了?
问这个问题的原因是这个帖子。如果我理解正确,我的代码不应该工作(因为"你不能定义全文索引……在MySQL中跨多个表")。因此,MATCH AGAINST
为ma.name_url
和v.model
,不会工作,因为它们没有索引(或者这是我如何理解它,纠正我,如果我错了:))。
然而,由于查询输出似乎是正确的,如果下面的代码是正确的,或者我应该添加/修改一些东西,我需要一个专家的建议:
SELECT v.*, vt.color, ma.*
FROM tbl_items AS v
LEFT JOIN tbl_options
AS vt on v.id = vt.v_id
LEFT JOIN tbl_names
AS ma on v.make = ma.id
WHERE
(
(
MATCH (ma.name_url) AGAINST ('keyword1' IN BOOLEAN MODE)
OR MATCH (v.model) AGAINST ('keyword1' IN BOOLEAN MODE)
)
AND
(
MATCH (ma.name_url) AGAINST ('keyword2' IN BOOLEAN MODE)
OR MATCH (v.model) AGAINST ('keyword2' IN BOOLEAN MODE)
)
)
AND v.type = 4
我认为你误解了这篇文章。单个全文索引只引用一个表。实际上,这对所有其他索引都是成立的,所以我不确定为什么会有混淆。索引可以引用表中的多个列,但只能引用一个表。
关于你的查询,我不知道全文索引和常规索引哪个更重要。
在编写查询时,您将返回不匹配match
条件的ma
行。也许这没什么,但是看起来很可疑。
并且,如果性能是一个问题,您可能会发现将查询分解为单独的子查询(通过UNION
或UNION ALL
连接)可以提供更好的性能。可以更有效地优化每个子查询