2013-11-16 3 views
1

Моя цель - показать результаты поиска компаний как с категориями, так и без (еще не добавлено). В таблице моих компаний более 12 000 записей. Компании с категориями более или менее 200.оптимизирующий запрос (LEFT JOIN)

Существует два входа для поиска: $ name -> название компании или категории. $ id_country -> идентификатор страны

Я хочу показать: 1) сколько результатов имеется во всей базе данных. (вот почему я использую: SQL_CALC_FOUND_ROWS) 2) Я использую LIMIT, чтобы показать 10 результатов на странице (с разбивкой на страницы).

Мой запрос:

SELECT SQL_CALC_FOUND_ROWS 
c.*, 
lc.name as langName, 
lc.shortDesc, 
lc.longDesc 

FROM companies c 
JOIN lang_companies lc USING(id_company) 
LEFT JOIN categories_companies cc USING(id_company) 
LEFT JOIN lang_categories lang_cat USING (id_category) 

WHERE 
lc.id_lang = '2' AND c.status = 1 AND c.active = 1 AND c.id_country = ".$id_country." AND 
(lc.name = LCASE('".$name."') OR (lang_cat.name = LCASE('".$name."') AND lang_cat.id_lang = '2') 
OR c.city = '".$name."') 
GROUP BY c.id_company 
ORDER BY c.id_hierarchi asc 
LIMIT 0, 10 

Этот запрос выполняется более или менее 6 секунд, и я хочу, чтобы оптимизировать его. Не могли бы вы помочь мне? Буду благодарен за любые предложения.

+0

Есть ли причина, по которой вы обычно используете AND и OR, но как только вы используете &&? На самом деле, я не знаю, что именно && делает/если есть разница с AND :) в этом коде: lang_cat.name = LCASE ('". $ Name."') && lang_cat.id_lang = '2' –

+0

yes , моя ошибка, я только что исправил ее – Ir3nicus

+0

Удалось ли вам решить эту проблему? Если нет, вы можете добавить текущий план выполнения запроса к этому вопросу. Затем легче анализировать возможности исполнения и возможности для оптимизации. –

ответ

0

Из ОТ части вашего запроса, вам не кажется, на самом деле использовать таблицы, которые соединяются с этими двумя линиями:

LEFT JOIN categories_companies cc USING(id_company) 
LEFT JOIN categories cat USING (id_category) 

Я полагаю, вы можете просто исключить их из запроса, если они не имеют отношения к чему-то более субетному, например, к подавлению строк.

+0

ok, я удалил «LEFT JOIN категории cat USING (id_category)», но «LEFT JOIN categories_companies cc USING (id_company)« Мне нужно знать, какая категория связана с компанией. – Ir3nicus

+0

Извините, я не обратил на это внимания. Выполняется ли запрос быстрее? –

+0

Хорошо, это точно то же самое время 6 секунд. Я думаю о вложенном SELECT, но я не знаю, как его использовать – Ir3nicus

Смежные вопросы