0

我有一个查询的性能问题。我有一张公司表(bedrijf)和一张类别表。我想做一个搜索查询,获取公司名称中包含搜索词的所有公司,并且我想获取类别名称包含搜索词的类别中的所有公司。

我做了这个查询(搜索词是: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%') 

如何在一个查询中执行这些查询而不会损失性能。该数据库在bedijf 中包含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 回答