2015-09-26 51 views
0

我試圖創建一個SELECT查詢,它通過LEFT JOIN合併3個表,然後MATCH特定關鍵字AGAINST生成的表。使用兩個LEFT JOIN,MATCH AGAINST和FULLTEXT索引創建有效的MySQL查詢

到目前爲止,我的測試表明查詢工作正常,輸出結果正確,但是當通過LEFT JOIN連接表時,我對FULLTEXT索引有疑問。

問題是 - 我應該添加額外的代碼來反映MATCH AGAINST在執行LEFT JOIN時的FULLTEXT索引要求,或者只有原始表中相關列的正確索引足夠了嗎?

詢問的原因是this post。如果我理解它正確,我的代碼不應該工作(因爲「你無法在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 

回答

0

我認爲你是誤讀職務。 A single僅供全文索引參考一張表。其實所有其他指標都是如此,所以我不確定爲什麼會出現混亂。索引可以引用表中的多個列,但僅限於一個表。

至於你的查詢,我不確定哪個更重要 - 全文索引或常規索引。

由於編寫查詢,您要退回不符合match條件ma行。也許這很好,但看起來很可疑。

而且,如果性能是一個問題,你可能會發現,打破了查詢到單獨的子查詢(由UNIONUNION ALL連接)提供更好的性能。每個子查詢可以更高效地進行優化。

+0

所以,我已經正確定義的索引和全文索引在'MATCH AGAINST'是罰款中使用的列的事實呢?例如,如果我在'tbl_names'的'name_url'上沒有'FULLTEXT'索引會怎麼樣?看起來這不影響輸出?另外,是的,我首先加入所有的'ma'行,然後我執行一個'MATCH'來查找哪些行符合條件。 – user3132858

+0

@ user3132858。 。 。布爾搜索不需要FULLTEXT,儘管它慢得多。我的觀點是,所有的過濾都可以在'v'上,而不是在'ma'上,所以你將有'ma'行都不符合條件。 –

+0

感謝您的幫助......所以基本上你是說如果我有一個關鍵字只匹配一個'ma'行,該行將不會在查詢結果中?我試過了,只搜索一個包含在'ma'中的一個關鍵字,結果如預期的那樣... – user3132858