0

ユーザーが単語やキーフレーズを入力すると情報が表示される検索機能を作成しようとしています。

LEFT JOINを使用して、検索可能にする必要があるすべてのテーブルを追加することを考えていました。誰かが私に話しましたUNIONが、それよりも遅いかもしれないという予感があります。JOIN

それで

$query = '
SELECT * 
FROM t1
  LEFT JOIN t2 
    ON t2.content = "blabla"
  LEFT JOIN t3
    ON t3.content = "blabla"
  [...]
WHERE t1.content =  "blabla"
';

上記は良い習慣ですか、それとも私が検討すべきより良いアプローチがありますか?

これの正しい道に私を送ってください:)また、なぜそれが間違っているのか、あなたのアプローチがより良いと思う理由を議論してください。そうすれば、私や他の人がこれを理解するのに役立ちます:

4

1 に答える 1

3

一般に、SQLエンジンのパフォーマンスがどのようになるかを「推測」するためにハンチをするのは悪い考えです。ここでは、テーブルのサイズ、インデックスの可用性、インデックスのカーディナリティなどを考慮した非常に高度な最適化が行われています。

この例では、セミデカルトJOINを生成しているため、LEFTJOINは間違っています。基本的に、結果セットには、思ったよりもはるかに多くの行が含まれますこれは、t1の一致する各行がt2の一致する各行と結合されるためです。t1で10行、t2で3行が一致する場合、10個の結果ではなく、30個の結果が得られます。

各テーブルから1つの行のみが一致することが保証されている場合でも(デカルト結合の問題を排除)、LEFTJOINソリューションでは操作が非常に難しいデータセットが提供されることは明らかです。これは、結合する各テーブルのコンテンツ列が結果セットの個別の列になるためです。どのテーブルが一致したかを判断するには、各列を調べる必要があります。

この場合、UNIONがより良いソリューションです。

また、注意してください:

  1. SELECTで「*」を使用することは一般的に良い考えではありません。これによりパフォーマンスが低下し(すべての列を結果セットにアセンブルする必要があるため)、このような場合、各コンテンツ列をALIASする機会が失われ、結果セットの操作が困難になります。

  2. これは、LEFTJOINの非常に斬新な使用法です。通常、2つの異なるテーブルの行を関連付けるために使用されます。この場合、これを使用して、3つの別々の結果セットを「並べて」生成します。ほとんどのSQLプログラマーは、あなたの意図が何であるかを理解するために、しばらくの間このステートメントを斜視で見る必要があります。

于 2011-01-24T14:45:45.897 に答える