Я запускаю поисковый запрос для сайта, который собирает element
, которые соответствуют запросу. Однако может быть или не быть один или более items
, которые связаны с element
. Итак, у меня есть подзапрос, который подсчитывает совпадения всех items
, связанных с element
.Выполнение подзапроса только по результатам родительского запроса
Этот запрос действительно работает. Но невероятно медленно. Сейчас мне требуется около 50 секунд. Если я сдавливаю подзапрос, это намного, намного быстрее.
SELECT DISTINCT e.id,
MATCH (e.heading) AGAINST ('+(room)') AS h_score,
MATCH (e.text) AGAINST ('+(room)') AS t_score,
(
SELECT SUM(MATCH (item.heading, item.text) AGAINST ('+(room)')) AS itemscore
FROM item LEFT JOIN _element_item ON item.id = _element_item.item_id
WHERE _element_item.item_id = e.id
AND MATCH (item.heading, item.text) AGAINST ('+(room)')
) AS i_score
FROM element AS e
LEFT JOIN _element_brand ON e.id = _element_brand.element_id
LEFT JOIN _element_language ON e.id = _element_language.element_id
LEFT JOIN _element_region ON e.id = _element_region.element_id
LEFT JOIN _element_type ON e.id = _element_type.element_id
LEFT JOIN _element_group ON e.id = _element_group.element_id
WHERE _element_brand.brand_id = 1
AND _element_language.language_iso = 'en'
AND _element_region.region_id = 1
AND _element_type.type_id = 1
AND _element_group.group_id = 1
AND e.replacement_id IS NULL
AND e.status = 1
AND MATCH (e.heading, e.text) AGAINST ('+(room)')
ORDER BY t_score + h_score DESC LIMIT 100
Есть ли способ заставить это работать быстрее?
Я предполагаю, что он запускает полный подзапрос для каждого element
перед тем, как сопоставить element
? Могу ли я заставить его запустить подзапрос по совпадениям в родительском запросе? Если да, то как?
У вас есть LEFT JOINs, но затем следуйте своему предложению WHERE, чтобы иметь конкретные критерии против этих таблиц, что приводит к INNER JOIN. Это было ваше намерение, или вы действительно имели в виду, что они были ЛЕВЫМИ ПРИСОЕДИНЯЯМИ. Если это так, переместите ваши И-критерии в соответствующий LEFT JOIN. – DRapp
ЕСЛИ Я честен, я думаю, что они закончились ЛЕВЫМИ ПРИСОЕДИНЯЯМИ, потому что это сработало. Но я ищу только те элементы, которые соответствуют критериям в таблицах связывания (начиная с подчеркивания). Меня не интересуют значения в объединенных таблицах. – ironinthesoul