0

クエリにパフォーマンスの問題があります。会社 (bedrijf) のテーブルとカテゴリのテーブルがあります。会社名に検索ワード t を含むすべての会社を取得する検索クエリを実行したいのですが、カテゴリ名に検索ワード t が含まれるカテゴリにあるすべての会社を取得したいと考えています。

私はこのクエリを作成しました (検索ワードは: marko):

/*8 seconds*/
 SELECT b.id,b.plaats
      FROM bedrijf AS b
      INNER JOIN bedrijf_categorie AS bc ON bc.bedrijfid = b.id
      WHERE b.naam LIKE '%marko%'
        OR bc.categorieid IN
          (SELECT id
           FROM categorie
           WHERE naam LIKE '%marko%') 

または、これはまだ大きなデータベースで何が高速かをテストしています:

/*7.6 seconds*/
SELECT b.id,b.plaats
      FROM bedrijf AS b
      INNER JOIN bedrijf_categorie AS bc ON bc.bedrijfid = b.id
      INNER JOIN categorie AS c ON bc.categorieid = c.id
      WHERE b.naam LIKE '%marko%' OR c.naam LIKE '%marko%'; 

クエリを個別に実行すると、はるかに高速になります。

/*0.84 seconds*/
SELECT b.id,b.plaats
      FROM bedrijf AS b
      WHERE b.naam LIKE '%marko%'

/*2.39 seconds*/      
SELECT b.id,b.plaats
      FROM bedrijf AS b
      INNER JOIN bedrijf_categorie AS bc ON bc.bedrijfid = b.id
      WHERE bc.categorieid IN
          (SELECT id
           FROM categorie
           WHERE naam LIKE '%marko%') 

パフォーマンスを損なうことなく、これらのクエリを 1 つのクエリで実行するにはどうすればよいでしょうか。データベースには、bedrijf に 500.000 レコード、bedijf_categorie に 500.000 レコードが含まれています。

4

1 に答える 1

1

より良い解決策が見つからない場合は、UNIONを作成できます。

(SELECT b.id,b.plaats
      FROM bedrijf AS b
      INNER JOIN bedrijf_categorie AS bc ON bc.bedrijfid = b.id
      WHERE bc.categorieid IN
          (SELECT id
           FROM categorie
           WHERE naam LIKE '%marko%')) UNION
(SELECT b.id,b.plaats
      FROM bedrijf AS b
      WHERE b.naam LIKE '%marko%')
于 2013-08-16T09:13:57.980 に答える