用两个左连接,MATCH AGAINST和FULLTEXT索引创建有效的MySQL查询



我试图创建一个SELECT查询,通过LEFT JOIN组合3个表,然后MATCH特定关键字AGAINST结果表。

到目前为止,我的测试表明查询工作正常,输出结果是正确的,但是,当通过LEFT JOIN连接表时,我对FULLTEXT索引有疑问。

问题是-我是否应该添加额外的代码来反映LEFT JOINMATCH AGAINSTFULLTEXT索引要求,或者只正确索引原始表中的相关列就足够了?

问这个问题的原因是这个帖子。如果我理解正确,我的代码不应该工作(因为"你不能定义全文索引……在MySQL中跨多个表")。因此,MATCH AGAINSTma.name_urlv.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行。也许这没什么,但是看起来很可疑。

并且,如果性能是一个问题,您可能会发现将查询分解为单独的子查询(通过UNIONUNION ALL连接)可以提供更好的性能。可以更有效地优化每个子查询

相关内容

  • 没有找到相关文章

最新更新