3

ワイルド カードを使用してレコードを検索するクエリを作成しようとしています。

以下に2つのクエリがありますが、どちらがより最適化されているかを知りたいです。

クエリ 1 では探しているものが得られますが、クエリ 2 では異なる結果が得られます。

どちらを使用する必要がありますか。

  1. クエリで Like を使用します。

    SELECT code, name
    FROM countryCounty
    WHERE name LIKE  '%County Down%'
    AND isActive =1
    AND countryISO2FK =  'GB'
    LIMIT 1
    
  2. 次に、ブール モード (FULLTEXT) クエリがあります。

    SELECT code,name, match( name )
    AGAINST ( 'County Down' IN BOOLEAN MODE ) AS relevance
    FROM opjb_countryCounty 
    WHERE match( name ) AGAINST ( '%County Down%' IN BOOLEAN MODE ) 
        AND isActive=1 
        AND countryISO2FK='GB' 
    ORDER BY relevance DESC LIMIT 1
    
4

2 に答える 2

6

2 つのクエリには大きな違いがあります。

'County Down'最初のクエリは、名前列内の単一の文字列の出現を検索しています。

2 番目のクエリは、2 つの別個の単語 (別個の文字列) のいずれかがテキスト内で出現するかどうかを検索し'County'ます'Down'。(その 2 番目のクエリの'%'前のその文字の目的と効果は、私にはわかりません。)'County'

BOOLEAN MODE 全文検索の関連性は 1.0 になります。'County' と 'Down' の両方の単語を含む行のみを返したい場合は、'+'各単語の前に修飾子を使用する必要があります。次に例を示します。

MATCH(name) AGAINST('+County +Down' IN BOOLEAN MODE)

この述語は'Some Down and out County'、たとえば、最初のクエリでは一致しない名前を含む名前にも「一致」することに注意してください。


また、関連性によって並べ替えられた結果セットを取得するために使用されるアプローチは、ほぼ正しいものです。微妙な問題があります:IN BOOLEAN MODE修飾子を含めると、式が 1.0 を返しNATURAL LANGUAGE MODEます。


あなたの質問に答えるには: 最初のクエリが必要な結果セットを返す場合は、そのクエリを使用してください。そのクエリの欠点は、そのクエリの LIKE 述語が sargable でないことです。つまり、MySQL はその述語を満たすためにインデックス レンジ スキャンを使用できません。(インデックスは他の述語に使用できますがname、それらの各行のその列をチェックする必要があります。

2 番目の形式のクエリの利点は、FULLTEXT INDEX が作成されている場合はそれを利用できることです。これにより、パフォーマンスが向上します。

于 2013-06-07T23:04:51.377 に答える