2013-08-16 5 views
0

У меня проблема с производительностью с запросом. У меня есть таблица с компаниями (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%') 

Как я могу выполнить эти запросы в одном запросе без потери производительности. База данных содержит 500 000 записей в постели и 500 000 записей в bedijf_categorie.

+2

Запрос выступления зависит от * много * факторов, большинство из них * конкретный * к базе данных. Когда у вас есть «проблема с производительностью» с одним из ваших запросов, вы должны сначала использовать ['EXPLAIN'] (http://dev.mysql.com/doc/refman/5.0/en/explain.html), чтобы увидеть, как используются различные индексы (или нет), и оценить количество исследуемых строк. –

ответ

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%') 
Смежные вопросы