denisimus77
Новичок
Оптимизация UNION
Есть такой запрос
(SELECT SQL_CALC_FOUND_ROWS MATCH(pl.desc) AGAINST("text") AS score, p.post_date, pl.post_name, p.img_id, p.cat_id
FROM posts_text_lang1 AS pl, posts_text1 AS p WHERE pl.lang = "en" AND MATCH(pl.desc) AGAINST("text") AND pl.rel_id = p.id )
UNION ALL
(SELECT MATCH(pl.desc) AGAINST("text") AS score, p.post_date, pl.post_name, p.img_id, p.cat_id
FROM posts_text_lang2 AS pl, posts_text2 AS p WHERE pl.lang = "en" AND MATCH(pl.desc) AGAINST("text") AND pl.rel_id = p.id )
UNION ALL
(SELECT MATCH(pl.desc) AGAINST("text") AS score, p.post_date, pl.post_name, p.img_id, p.cat_id
FROM posts_text_lang3 AS pl, posts_text3 AS p WHERE pl.lang = "en" AND MATCH(pl.desc) AGAINST("text") AND pl.rel_id = p.id )
ORDER BY score DESC LIMIT 0, 20
Происходит полнотекстовый поиск по трем таблицам, затем результаты всех таблиц объеденяются, сортируются по коэфициенту релевантности и выводятся порциями по 20 записей на страницу.
Внутри каждого запроса две таблицы, одна главная posts_text1, другая posts_text_lang1 содержит перводы постов на разные языки. К сути вопроса я думаю они мало имеют отношения.
С каждым постом связаны еще каритнки и категория, в p.img_id, p.cat_id хранятся индексы соответствующих
записей. И на странице вывода нужно эту картинку и категорию показать.
Задача написать запрос оптимальным образом.
Я не знаю как лучше извлекать значения для картинки и имени категории, включать эту выборку в внутрь каждого UNIONа
или потом отдельно пробижаться по выбранным 20 строчкам и добавить к ним необходимую информацию.
Меня смущает то, что Каждый SELECT внутри UNIONа, охватывает очень большие таблицы и результат поиска может возвращать тысячи строк, и как я понимаю MySQL должен выбрать каждую из трех таблиц польностью, потом все сложить и отсортировать. Это так?
Если да, то наверно будет очень накладно к этой операции добавлять еще несколько объединений с др. таблицами?
Я думал все дополнительные выборки сделать после полнотекстового поиска, пробигая по выбранным строкам циклом и создавая таким образом еще 20 запросов к БД, но они должны быть быстрые, т.к. будет использоваться PRIMARY KEY, для выборки.
Еще вопрос, как повлияет на производителность, если для каждого SELECTа добавить свой ORDER BY score, это может ускорить последующую общую сортировку или только хуже?
Спасибо.
Есть такой запрос
(SELECT SQL_CALC_FOUND_ROWS MATCH(pl.desc) AGAINST("text") AS score, p.post_date, pl.post_name, p.img_id, p.cat_id
FROM posts_text_lang1 AS pl, posts_text1 AS p WHERE pl.lang = "en" AND MATCH(pl.desc) AGAINST("text") AND pl.rel_id = p.id )
UNION ALL
(SELECT MATCH(pl.desc) AGAINST("text") AS score, p.post_date, pl.post_name, p.img_id, p.cat_id
FROM posts_text_lang2 AS pl, posts_text2 AS p WHERE pl.lang = "en" AND MATCH(pl.desc) AGAINST("text") AND pl.rel_id = p.id )
UNION ALL
(SELECT MATCH(pl.desc) AGAINST("text") AS score, p.post_date, pl.post_name, p.img_id, p.cat_id
FROM posts_text_lang3 AS pl, posts_text3 AS p WHERE pl.lang = "en" AND MATCH(pl.desc) AGAINST("text") AND pl.rel_id = p.id )
ORDER BY score DESC LIMIT 0, 20
Происходит полнотекстовый поиск по трем таблицам, затем результаты всех таблиц объеденяются, сортируются по коэфициенту релевантности и выводятся порциями по 20 записей на страницу.
Внутри каждого запроса две таблицы, одна главная posts_text1, другая posts_text_lang1 содержит перводы постов на разные языки. К сути вопроса я думаю они мало имеют отношения.
С каждым постом связаны еще каритнки и категория, в p.img_id, p.cat_id хранятся индексы соответствующих
записей. И на странице вывода нужно эту картинку и категорию показать.
Задача написать запрос оптимальным образом.
Я не знаю как лучше извлекать значения для картинки и имени категории, включать эту выборку в внутрь каждого UNIONа
или потом отдельно пробижаться по выбранным 20 строчкам и добавить к ним необходимую информацию.
Меня смущает то, что Каждый SELECT внутри UNIONа, охватывает очень большие таблицы и результат поиска может возвращать тысячи строк, и как я понимаю MySQL должен выбрать каждую из трех таблиц польностью, потом все сложить и отсортировать. Это так?
Если да, то наверно будет очень накладно к этой операции добавлять еще несколько объединений с др. таблицами?
Я думал все дополнительные выборки сделать после полнотекстового поиска, пробигая по выбранным строкам циклом и создавая таким образом еще 20 запросов к БД, но они должны быть быстрые, т.к. будет использоваться PRIMARY KEY, для выборки.
Еще вопрос, как повлияет на производителность, если для каждого SELECTа добавить свой ORDER BY score, это может ускорить последующую общую сортировку или только хуже?
Спасибо.