SQL UNION с LIMIT оптимизирует ненужные запросы? - PullRequest
5 голосов
/ 11 февраля 2011

Скажем, у меня есть последовательность запросов, которые постепенно становятся все дороже. Я могу объединить все это с профсоюзом, но меня интересуют только первые 10 результатов, поэтому я добавляю LIMIT. Запрос выглядит примерно так:

(SELECT col1, col2 FROM table WHERE colx = 'x')
UNION
(SELECT col1, col2 FROM table WHERE colx LIKE '%x%')
UNION
(SELECT col1, col2 FROM table WHERE colx LIKE '%x%' AND unindexedcol LIKE '%y%')
LIMIT 10

Я знаю, что это не гарантированно будет первой десяткой в ​​первом запросе, как указано в документации MySQL

UNION по умолчанию создает неупорядоченный набор строк

но на практике получается, что результаты упорядочены, выберите 1, затем выберите 2 и т. Д., Пока не будет достигнут предел.

Так MySQL выполняет запросы последовательно и останавливается, когда он достигает предела? Если нет, то как лучше выполнить этот стиль запроса, когда требуется только подмножество результатов, и предпочтение отдается менее дорогим запросам, чтобы минимизировать время выполнения?

Ответы [ 2 ]

3 голосов
/ 11 февраля 2011

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

select @a1 := 0;
select @a2 := 0;

(SELECT id, @a1:=@a1+1 FROM companies)
UNION
(SELECT id, @a2:=@a2+1 FROM invoices)
LIMIT 10;

Затем я наблюдаю значения переменных @ a1 и @ a2:

select @a1 as a1, @a2 as a2;

В моих тестах они равны a1 = 81 и a2 = 467. Таким образом, одиночный выбор запроса объединения не ограничен.

2 голосов
/ 11 февраля 2011

Поскольку вам нужно только 10 строк от объединения, вы можете добавить LIMIT 10 к каждому из подзапросов, чтобы каждый из них возвращал не более 10 строк.

...