使用搜索查询搜索性能问题

时间:2013-08-16 08:57:54

标签: mysql sql performance search

我的查询存在性能问题。我有一个公司的桌子(bedrijf)和一个类别的表。我想做一个搜索查询,该搜索查询将公司名称中包含搜索字的所有公司带走,我希望将所有类别名称中包含搜索字词的公司带入。

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

如何在一次查询中执行这些查询而不会丢失性能。该数据库在bedrijf中包含500.000条记录,在bedijf_categorie中包含500.000条记录。

1 个答案:

答案 0 :(得分: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%')