Как получить оптимизированный нумерованный список из запроса, в котором есть UNION ALL? - PullRequest
1 голос
/ 27 сентября 2011

У меня есть запрос, сформированный UNION ALL из двух таблиц.Результаты должны быть упорядочены и разбиты на страницы (как типичный список веб-приложения).

Исходный запрос (упрощенный):

SELECT name, id
FROM _test1 -- conditions WHERE
UNION ALL
SELECT name, id
FROM _test2 -- conditions WHERE
ORDER BY name DESC LIMIT 10,20

Проблема состоит в том, что 2 таблицы имеютболее 1 миллиона строк каждая, и запрос очень медленный.

Как получить оптимизированный нумерованный список из UNION ALL?

Постданные:

Я использовал поиск переполнения стека и нашел несколько похожих вопросов.из этого, но ответ был неправильным, или вопрос не совсем то же самое.Два примера:

Оптимизация MySQL-запроса UNION

Объединение операций UNION и LIMIT в запросе MySQL

Я удивленчто в Stack Overflow никто не мог ответить на этот вопрос.Может быть, невозможно сделать этот запрос более эффективно?Что может быть решением этой проблемы?

1 Ответ

3 голосов
/ 27 сентября 2011

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

(   SELECT name, id
    FROM _test1 -- conditions WHERE
    ORDER BY name DESC LIMIT 0, 30
)
UNION ALL
(   SELECT name, id
    FROM _test2 -- conditions WHERE
   ORDER BY name DESC LIMIT 0, 30
)
ORDER BY name DESC
LIMIT 10, 20

Вы в основном ограничиваете каждый подзапрос подмножеством возможных строк, которые могут быть на данной странице. Таким образом, вам нужно всего лишь извлечь и объединить 20 строк из каждой таблицы, прежде чем определять, какие 10 вернуть. В противном случае сервер потенциально получит все строки из каждой таблицы, упорядочит и объединит их, а затем попытается найти правильные строки.

Я не очень часто использую MySQL, поэтому не могу гарантировать, что движок будет работать так, как я думаю:)

В любом случае, когда вы перейдете на более поздние страницы, вы все равно собираетесь объединять все большие и большие наборы данных. ОДНАКО, я твердо убежден в том, что пользовательский интерфейс НИКОГДА не должен позволять пользователю получать набор записей, которые позволяют ему перейти (например, на страницу 5000). Это просто слишком много данных для человеческого разума, чтобы найти полезные сразу и должны требовать дальнейшей фильтрации. Возможно, пусть они увидят первые 100 страниц (или какое-то другое число), но в противном случае им придется ограничивать результаты лучше. Только мое мнение, хотя.

...