Сложный запрос в Union MySQL несколько раз - Оптимизатор - PullRequest
0 голосов
/ 05 мая 2018

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

Например

(SELECT * FROM (SELECT * FROM A INNER JOIN B ... AND SOME COMPLEX WHERE CONDITIONS) as T ORDER BY column1 DESC LIMIT 10)
UNION
(SELECT * FROM (SELECT * FROM A INNER JOIN B ... AND SOME COMPLEX WHERE CONDITIONS) as T ORDER BY column2 DESC LIMIT 10)
UNION
(SELECT * FROM (SELECT * FROM A INNER JOIN B ... AND SOME COMPLEX WHERE CONDITIONS) as T ORDER BY column3 DESC LIMIT 10)

Выполнено ли (SELECT * FROM A INNER JOIN B ... AND SOME COMPLEX WHERE CONDITIONS) 3 раза?

Если mysql достаточно умен, то внутренний подзапрос будет выполнен только один, поэтому мне не нужна какая-либо оптимизация, но если нет, мне придется использовать что-то другое для его оптимизации (например, использование временной таблицы, но я хочу этого избежать). )

Нужно ли оптимизировать этот запрос с помощью другого синтаксиса? Любое предложение?

На практике я хочу отфильтровать некоторые данные из огромных записей и получить некоторые из них в 3 групповых секциях, каждый раздел в различном порядке

1 Ответ

0 голосов
/ 19 мая 2018

План A:

На

A TEMPORARY TABLE нельзя ссылаться более одного раза. Итак, постройте постоянный стол и DROP, когда закончите. (Если у вас может быть несколько соединений, делающих одно и то же, будет сложно убедиться, что вы не используете одно и то же имя таблицы.)

План Б:

С MySQL 8.0 вы можете сделать

WITH T AS ( SELECT ... )
SELECT ... FROM T ORDER BY col1
UNION ...

План C:

Если это возможно сделать:

SELECT id FROM A
     ORDER BY col1 LIMIT 10

Вы можете использовать это как «производную» таблицу внутри

(SELECT * FROM A INNER JOIN B ... AND SOME COMPLEX WHERE CONDITIONS)

что-то вроде

SELECT A.*, B.*
    FROM ( SELECT id FROM A
               ORDER BY col1 LIMIT 10 ) AS x1
    JOIN A  USING(id)
    JOIN B ... AND SOME COMPLEX WHERE CONDITIONS

Аналогично для двух других SELECTs, затем UNION их вместе.

Еще лучше, UNION вместе 3 набора ids, , затем JOIN до A и B один раз .

Это может иметь преимущество при работе с меньшим количеством строк.

...